如何根据time
字段获取第一个和最后一个文档。
我可以使用$group
并获取$first
和$last
文档,但我不需要在此处进行分组,只需获取第一个和最后一个完整文档。也许我可以使用slice
?此查询不起作用:
{
"aggregate": "353469045637980_data",
"pipeline": [
{
"$match": {
"$and": [
{
"time": {
"$gte": 1461369600
}
},
{
"time": {
"$lt": 1461456000
}
}
]
}
},
{
"$project": {
"first": {
"$slice": 1
},
"last": {
"$slice": -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
)。