5

这个应该按月过滤结果的查询似乎工作正常。但我也不知道如何添加年份过滤器。

db.collection.find({
  "$expr": {
    "$eq": [{ "$month": "$timestamp" }, 12]
  }
});

我试图想出这样的东西,但没有成功。

db.collection.find({
  "$expr": {
    "$and": [
      { "$eq": [{ "$month": "$timestamp" }, 12] }, 
      { "$eq": [{ "$year": "$timestamp" }, 2018] }
    ]
  }
});

如何正确地做到这一点?

4

2 回答 2

13

我想使用查找而不是聚合。像这样添加另一个$eq$and我有用。

db.collection.find({
  $and: [
    { $expr: {$eq: [{$month: "$timestamp"}, 12]} },
    { $expr: {$eq: [{$year: "$timestamp"}, 2019]} }
  ]
});
于 2019-12-25T17:18:35.927 回答
1

您可以使用aggregate而不是find.

一个 3 步解决方案将非常有效:

  1. $project年份和月份字段以及文档本身,使用$$ROOT. 由于$project只输出指定的字段,我们还需要投影文档本身。
  2. 使用 . 按您想要的年份和月份过滤$match
  3. $replaceRoot将原始文档放回顶层(将其展平)。
db.collection.aggregate([
  {
    "$project": {
      "year": { "$year": "$timestamp" },
      "month": { "$month": "$timestamp" },
      "document": "$$ROOT"
    }
  },
  {
    "$match": {
      "year": 2018,
      "month": 12
    }
  },
  {
    "$replaceRoot": { "newRoot": "$document" }
  }
])
于 2019-01-24T00:51:59.297 回答