Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 从数组中查找前N个条目_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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
数组中获取单个
best
Tripcount
,然后输出其中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。