2017-08-21 20 views
1

我有以下文件:如何通過組並獲得各組前N和前N的其他領域MongoDB中

{ 
    "_id" : ObjectId("599b1a789125130dfc613188"), 
    "traj_id" : 1, 
    "aisle_id" : "Aisle01", 
    "traf_seq" : [ 
     { 
      "node" : "catg1", 
      "pst" : 1, 
      "time" : 12.0 
     }, 
     { 
      "node" : "catg2", 
      "pst" : 2, 
      "time" : 12.0 
     } 
    ] 
}, 
{ 
    "_id" : ObjectId("599b1a789125130dfc613188"), 
    "traj_id" : 2, 
    "aisle_id" : "Aisle01", 
    "traf_seq" : [ 
     { 
      "node" : "catg1", 
      "pst" : 1, 
      "time" : 12.0 
     }, 
     { 
      "node" : "catg2", 
      "pst" : 2, 
      "time" : 12.0 
     }, 
     { 
      "node" : "catg1", 
      "pst" : 1, 
      "time" : 12.0 
     }, 
    ] 
}, 
{ 
    "_id" : ObjectId("599b1a789125130dfc613188"), 
    "traj_id" : 3, 
    "aisle_id" : "Aisle02", 
    "traf_seq" : [ 
     { 
      "node" : "catg1", 
      "pst" : 1, 
      "time" : 12.0 
     }, 
     { 
      "node" : "catg2", 
      "pst" : 2, 
      "time" : 12.0 
     }, 
     { 
      "node" : "catg2", 
      "pst" : 3, 
      "time" : 12.0 
     }, 
    ] 
} 

我想頂端N類走訪了每個過道。說,對於N = 1, 預期輸出會是這樣的:

"_id" : { 
    "aisle" : "Aisle01", 
    "catg" : "catg1" 
}, 
"maxValue" : 3.0 


"_id" : { 
    "aisle" : "Aisle02" 
    "catg" : "catg2" 

}, 
"maxValue" : 2.0 

由於在過道1,CATG 1已被訪問的次數的最大數目(即3),和catg2在過道被訪問了2次(最大值)。

我可以在每個過道獲得最大數量,但我很努力地獲得類別名稱,因爲我將它排除在字段組中。 或者我得到所有類別的名稱,我不想要。 下面是我到目前爲止有:

db.test.aggregate([ 
{$unwind:"$traf_seq"}, 
{$group: { 
"_id": { 
    "traj_id" :"$traj_id", 
    "node": "$traf_seq.node", 
    "aisle":"$aisle_id" 
}, 
"count":{ 
    "$sum":1} 
}}, 
{$group: { 
"_id": { 
    "sumnode":"$_id.node", 
    "aisle": "$_id.aisle"}, 
"distcount":{ 
    "$sum":1}, 
}}, 
{$group: { 
"_id": { 
    "aisle": "$_id.aisle"}, 
    "otherField1":{$push:"$_id.sumnode"},   
"maxValue": {$max:"$distcount"} 
}} 

回答

0

對於N = 1,下面應該做的伎倆:

db.test.aggregate([ 
    { $unwind: "$traf_seq" }, 
    { 
     $group: { 
      "_id": { 
       "aisle": "$aisle_id", 
       "node": "$traf_seq.node" 
      }, 
      "maxvalue": { $sum: 1 } 
     } 
    }, 
    { 
     $sort: { 
      "maxvalue": -1 
     } 
    }, 
    { 
     $group: { 
      "_id": "$_id.aisle", 
      "maxvalue": { $first: "$maxvalue" }, 
      "catg": { $first: "$_id.node" } 
     } 
    } 
]) 

如果需要輸出的不同結構,你可以使用$project實現那。只要讓我知道應該是這樣的話......

對於任意N,下面應該讓你開始:

db.test.aggregate([ 
    { $unwind: "$traf_seq" }, 
    { 
     $group: { 
      "_id": { 
       "aisle": "$aisle_id", 
       "node": "$traf_seq.node" 
      }, 
      "maxvalue": { $sum: 1 } 
     } 
    }, 
    { 
     $sort: { 
      "maxvalue": -1 
     } 
    }, 
    { 
     $group: { 
      "_id": "$_id.aisle", 
      "docs": { 
       $push: { 
        "maxvalue": "$maxvalue", 
        "catg": "$_id.node" 
       } 
      } 
     } 
    }, 
    { 
     $project: 
     { 
      docs: { 
       $slice: 
       [ 
        "$docs", 
        2 // this is where you can configure you N records 
       ] 
      } 
     } 
    }, 
    { $unwind: "$docs" } 
]) 
+0

感謝您的回答..它的作品! 對不起,我忘了在問題中提到這一點,但如果我想計算不同的訪問(例如,每個文檔每個traj_id出現兩次catg 1,我只想將它計爲1),那麼我在哪裏添加?我可以在組中添加traj_id嗎? –

+0

NM ..我明白了..只是不得不在所有分組中添加過道。謝謝! –