MongoDB - 查询以获取与聚合中排序的第一项中的键匹配的项目

MongoDB - query to get items that match key in first item of sort in aggregate

我们在集合中有以下记录:

{ "_id" : ObjectId("1"), "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("2"), "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("3"), "date" : ISODate("2017-03-03T00:00:00Z") }
{ "_id" : ObjectId("4"), "date" : ISODate("2017-02-02T00:00:00Z") }
{ "_id" : ObjectId("5"), "date" : ISODate("2017-03-01T00:00:00Z") }
{ "_id" : ObjectId("6"), "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("7"), "date" : ISODate("2017-01-02T00:00:00Z") }
{ "_id" : ObjectId("8"), "date" : ISODate("2017-01-03T00:00:00Z") }

如何按 date 字段的 $month 过滤最近的记录,如下所示:

{ "_id" : ObjectId("3"), "date" : ISODate("2017-03-03T00:00:00Z") }
{ "_id" : ObjectId("5"), "date" : ISODate("2017-03-01T00:00:00Z") }

如果您使用 collection.find() 方法,请同时使用 sort 方法。
像这样:collection.find().sort({created : -1})

如果要过滤,看这个一次:

collection.find({ $expr: {
$eq: [{ $month: "$date" }, 03]
}});

希望对您有所帮助!

  1. $group - 按 date 开始的月份的第一天分组,并将文档添加到 data 数组中。

  2. $sort - 按 _id DESC.

    排序
  3. $skip

  4. $limit - 从结果中取出第一个文档。

  5. $unwind - 将 data 数组解构为多个文档。

  6. $replaceWith - 将文档替换为 data 文档。

db.collection.aggregate([
  {
    $group: {
      _id: {
        "$dateFromParts": {
          "year": {
            $year: "$date"
          },
          "month": {
            $month: "$date"
          },
          "day": 1
        }
      },
      data: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $sort: {
      _id: -1
    }
  },
  {
    $skip: 0
  },
  {
    $limit: 1
  },
  {
    $unwind: "$data"
  },
  {
    $replaceWith: "$data"
  }
])

Sample Mongo Playground

如果愿意使用聚合,可以使用

  • $month 从 date
  • 获取月份
  • $match过滤值
  • $sort 按 ASC 或 DESC 排序
  • $project 保留或删除字段

这是代码

db.collection.aggregate([
  {
    "$addFields": {
      month: { $month": "$date"}
    }
  },
  { "$match": { month: 3 } },
  { "$sort": { date: 1}},
  { "$project": { date: 1 } }
])

工作Mongo playground