2016-08-08 51 views
0

Hier ist der Datensatz:Karte Aggregation Ergebnisse in Mongo

{ "_id" : "1", "key" : "111", "payload" : 100, "type" : "foo", "createdAt" : ISODate("2016-07-08T11:59:18.000Z") } 
{ "_id" : "2", "key" : "111", "payload" : 100, "type" : "bar", "createdAt" : ISODate("2016-07-09T11:59:19.000Z") } 
{ "_id" : "3", "key" : "222", "payload" : 100, "type" : "foo", "createdAt" : ISODate("2016-07-10T11:59:20.000Z") } 
{ "_id" : "4", "key" : "222", "payload" : 100, "type" : "foo", "createdAt" : ISODate("2016-07-11T11:59:21.000Z") } 
{ "_id" : "5", "key" : "222", "payload" : 100, "type" : "bar", "createdAt" : ISODate("2016-07-12T11:59:22.000Z") } 

ich zu einer Gruppe haben sie durch key:

db.items.aggregate([{$group: {_id: {key: '$key'}}}]) 

, die den nächsten Satz erzeugt:

{ "_id" : { "key" : "111" } } 
{ "_id" : { "key" : "222" } } 

Und Danach muss ich die letzten Werte von foo und bar pro abrufen Gruppendatensatz. Meine Frage ist, was ist der optimale Weg, es zu tun? Ich kann die Elemente in Javascript iterieren und führen zusätzliche Roundtrip zu DB pro Gruppenergebnis. Aber ich bin mir nicht sicher, ob es zeiteffizient ist.

Antwort

2

Ich bin über die optimalste Weise nicht sicher, es zu tun, aber die leicht wird, ist Ihre Aggregation Pipeline zu erweitern wie

db.items.aggregate([ 
    { 
    $group: 
     { 
     _id: { key: "$key", type: "$type" }, 
     last: { $max: "$createdAt" } 
     } 
    }, 
    { 
    $group: 
    { 
     _id: { key: "$_id.key" }, 
     mostRecent: { $push: { type: "$_id.type", createdAt: "$last" } } 
    } 
    } 
]); 

dass für Ihre Sammlung von Dokumenten in

führen
{ "_id" : { "key" : "222" }, "mostRecent" : [ { "type" : "bar", "createdAt" : ISODate("2016-07-12T11:59:22Z") }, { "type" : "foo", "createdAt" : ISODate("2016-07-11T11:59:21Z") } ] } 
{ "_id" : { "key" : "111" }, "mostRecent" : [ { "type" : "bar", "createdAt" : ISODate("2016-07-09T11:59:19Z") }, { "type" : "foo", "createdAt" : ISODate("2016-07-08T11:59:18Z") } ] }