从阵列中查找前N个条目

时间:2017-06-02 11:19:15

标签: mongodb mongodb-query aggregation-framework

我的收藏结构如下:

{
    "_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不同,因为只提供了一个文档。

1 个答案:

答案 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 ] } } }
])