Mongodb 从数组中查找前N个条目
我的收藏结构如下:Mongodb 从数组中查找前N个条目,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我的收藏结构如下: { "_id": 1, "Trips": [ { "EndID": 5, "Tripcount": 12 }, { "EndID": 6, "Tripcount": 19 } ], "_id": 2, "Trips": [ { "En
{
"_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个tripCount。可能吗
我已经有了以下内容,但是这只从每个Trips
数组中获取单个bestTripcount
,然后输出其中50个。因此,在一个trips
数组中实际包含前两个trips会导致此查询删除第二个trips:
var group = db.eplat1.aggregate([
{ "$unwind": "$Trips"},
{ "$sort": {
"Trips.Tripcount": -1
}
},
{ "$limit": 50 },
{ "$group": {
"_id": 1,
"Trips": {
"$push": {
"Start": "$_id",
"Trips": "$Trips"
}
}
}}
], {allowDiskUse: true})
请注意,我认为这个问题与不同,因为只给出了一个文档。基本上,您需要对数组元素(//)进行排序,然后您可以对顶部值和结果进行排序
最后,在数组中的文档中输入“top 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 ] } } }
])
那么问题是什么呢?您可以$unwind
数组,这样您就拥有了所有条目。您可以对它们进行$sort
排序,使计数位于顶部。然后您将$limit
,这就是前50个条目。您认为还需要什么?@NeilLunn如前所述,在一个trips数组中有2个top trips会导致失去第二个top trips,因为只有每个trips
array的单个top trips在这里得到输出。所以您想要“每个文档”中“每个数组”的“top 2”trips?实际上,你的问题没有你想象的那么清楚,所以你真的应该回答。不,在你将所有trips
数组组合起来之后,我想要前N个trips。我的问题:假设有2个文档和2个trip数组,第一个包含2个trip(计数5和6),第二个包含一个计数为4的trip。上面的这个查询输出了限制为2的6和4,而不是应该的6和5。@NeilLunn Nvm找到了它。应该是“\u id”:“$\u id”
和“Start”:“$\u id”
应该是组阶段中的“End”:“$EndID”
。是的,我有3.4.4。