我的收藏结构如下:
{
"_id": 1,
"Trips": [
{
"EndID": 5,
"Tripcount": 12
},
{
"EndID": 6,
"Tripcount": 19
}
],
"_id": 2,
"Trips": [
{
"EndID": 4,
"Tripcount": 12
},
{
"EndID": 5,
"Tripcount": 19
}
], ...
}
可以看出,每个文档都有一个Trips
数组。现在我想要找到的是,在集合中的文档中,所有Trips
数组合的前N个Tripcounts。这可能吗?
我已经有以下内容,但是这只会从每个Tripcount
数组中获取单个最大Trips
,然后输出其中的50个。因此实际上在一个Trips
数组中进行前2次跳转导致此查询丢弃第二个:
var group = db.eplat1.aggregate([
{ "$unwind": "$Trips"},
{ "$sort": {
"Trips.Tripcount": -1
}
},
{ "$limit": 50 },
{ "$group": {
"_id": 1,
"Trips": {
"$push": {
"Start": "$_id",
"Trips": "$Trips"
}
}
}}
], {allowDiskUse: true})
请注意,我认为此问题与this one不同,因为只提供了一个文档。
答案 0 :(得分:2)
基本上你需要对数组元素进行排序($unwind
/ $sort
/ $group
)然后你可以为$sort
获取最高值$limit
结果。
最后,你$slice
了解数组文档中的“前N”。
db.eplat1.aggregate([
{ "$unwind": "$Trips" },
{ "$sort": { "_id": 1, "Tips.TripCount": -1 } },
{ "$group": {
"_id": "$_id",
"Trips": { "$push": "$Trips" },
"maxTrip": { "$max": "$Trips.TripCount" }
}},
{ "$sort": { "maxTrip": -1 } },
{ "$limit": 50 },
{ "$addFields": { "Trips": { "$slice": [ "$Trips", 0 , 2 ] } } }
])