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

时间:2016-08-16 12:57:00

标签: 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
        }
      }
    }
  ]
}

1 个答案:

答案 0 :(得分:0)

我知道这并不能直接回答问题,但是当我遇到这个问题时会对我有很大帮助。

您可以(就像 DAXaholic 解释的那样)使用以下查询来获取相应的文档:

[
  $sort: {...},
  $group: {
    _id: null,
    first: { $first: "$$ROOT" },
    last: { $last: "$$ROOT" }
  }
]

我遇到的问题是出现以下错误:Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.

要解决此问题(不使用磁盘进行排序),您可以使用:

[
  $group: {
    _id: null,
    first: { $min: "$time" },
    last: { $max: "$time" }
  }
]

优点是您不需要排序,因此可能不会在 100 MB 内存限制下运行。缺点是它不返回整个文档(其中 $min / $max 匹配),而只返回属性的值(在本例中为 time)。