2017-08-21 1 views
1

Je les documents suivants:Comment groupe et obtenir par dessus N dans chaque groupe et d'autres domaines de haut N dans 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 
     }, 
    ] 
} 

Je suis en train de les principales catégories N visités dans chaque Aisle. Dites N = 1, sortie prévue serait quelque chose comme:

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


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

}, 
"maxValue" : 2.0 

Depuis dans l'allée 1, catg 1 a été visité le nombre maximum de fois (c.-à-3), et catg2 dans l'allée a été visité 2 fois (le maximum).

Je peux obtenir le nombre maximum dans chaque allée, mais j'ai du mal à obtenir le nom de la catégorie, puisque je l'exclure dans le groupe par champ. OU je reçois les noms de toutes les catégories, ce que je ne veux pas. Ci-dessous ce que j'ai jusqu'à présent:

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"} 
}} 

Répondre

0

Pour N = 1, ce qui suit devrait faire l'affaire:

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" } 
     } 
    } 
]) 

Si vous avez besoin d'une structure différente de la sortie, vous pouvez utiliser $project pour atteindre cette. Laissez-moi savoir si cela est le cas ...

Pour un N arbitraire, ce qui suit devrait vous aider à démarrer:

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

Merci pour la réponse .. ça marche! Désolé j'ai oublié de le mentionner dans la question, mais si je veux compter des visites distinctes (disons que catg 1 apparaît deux fois par document par traj_id je veux le compter seulement comme 1), où dois-je ajouter? Puis-je ajouter traj_id dans le groupe? –

+0

NM .. je l'ai eu .. juste dû ajouter l'allée dans tous les groupements .. Merci! –