MongoDB Aggregate - 查询 以 获取 与 排序 的 第 一 个 项目 中 的 关键 字 匹配 的 项目

eanckbw9  于 2022-11-22  发布在  Go
关注(0)|答案(3)|浏览(138)

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

{ "_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") }
wixjitnu

wixjitnu1#

  1. $group-按date中一年中的第一天分组,并将文档添加到data数组中。
  2. $sort-按_id说明排序。
  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

6jjcrrmo

6jjcrrmo2#

如果你使用collection.find()方法,那么可以沿着使用sort方法。
例如:collection.find().sort({created : -1})
如果要过滤,该看这一下:

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

希望这对你有帮助!

3b6akqbq

3b6akqbq3#

如果希望使用聚合,可以使用

  • $month以取得开始日期的月份
  • $match以过滤值
  • $sort按ASC或DESC排序
  • $project保留或删除字段

以下是代码

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

工作Mongo playground

相关问题