MongoDB在聚合查询中获取第一个和最后一个文档

标签 mongodb mongodb-query aggregation-framework mongodb-aggregation

如何根据 time 字段获取第一个和最后一个文档。 我可以使用 $group 并获取 $first$last 文档,但我不需要在这里分组,只需获取第一个和最后一个完整的文档。也许我可以使用 slice?此查询不起作用:

{
  "aggregate": "353469045637980_data",
  "pipeline": [
    {
      "$match": {
        "$and": [
          {
            "time": {
              "$gte": 1461369600
            }
          },
          {
            "time": {
              "$lt": 1461456000
            }
          }
        ]
      }
    },
    {
      "$project": {
        "first": {
          "$slice": 1
        },
        "last": {
          "$slice": -1
        }
      }
    }
  ]
}

最佳答案

你需要 $group 但你可以简单地使用一个常量(例如 null,参见 the docs )作为它的 id 以便它产生一个组。 $$ROOT then 指的是文档本身,您可以像这样使用 $first$last

$group: {
  _id: null,
  first: { $first: "$$ROOT" },
  last: { $last: "$$ROOT" }
}

当然,您可以引入进一步的 $project 阶段以将该数据塑造成一个数组(正如您提到的,您需要一个列表)等。

作为旁注,您可能需要引入 $sort 阶段以确保 $first$last 具有正确的含义。

关于MongoDB在聚合查询中获取第一个和最后一个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38975607/

相关文章:

javascript - 如何修复 Mongoose 接口(interface)中的 ObjectParameterError 错误

regex - 具有计数和条件的不同值 mongoDB

arrays - mongodb 中的合并聚合

arrays - mongodb - 将多个文档的数组字段连接到一个数组字段

scala - 如何使用 MongoListField 返回列表

node.js - Mongoose 如何在 update/findOneAndUpdate 时验证类型和值

mongodb - 如何使用官方Go驱动程序在MongoDB中持久存储文件(小于16MB)

mongodb - 如何将两个数组转换为 mongoDB 中的对象,其中第一个数组具有多个相同的值

mongodb - Mongoose 的深处

node.js - Mongoose 更新或插入许多文件