我们收集了以下记录:

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

推荐答案

  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

Javascript相关问答推荐

如何使用侧边滚动按钮具体滚动每4个格?

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

如何用显示网格平滑地将元素从一个地方移动到另一个地方?

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

将字符串UTC Date转换为ngx—counting leftTime配置值的数字

还原器未正确更新状态

使用原型判断对象是否为类的实例

连接到游戏的玩家不会在浏览器在线游戏中呈现

第三方包不需要NODE_MODULES文件夹就可以工作吗?

让chart.js饼图中的一个切片变厚?

如何在 Select 文本时停止Click事件?

MongoDB受困于太多的数据

更新Redux存储中的对象数组

如何为仅有数据可用的点显示X轴标签?

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

Cherrio JS返回父div的所有图像SRC

使用可配置项目创建网格

扩散运算符未按预期工作,引发语法错误

如何将值从后端传递到前端

TypeScrip Types-向流程对象添加属性