2017-12-31 123 views
1

Ich versuche, Mongo-Aggregation-Framework zu verwenden, um eine Sammlung basierend auf einem Zeitstempel zu gruppieren und $ out zu verwenden, um es in einer neuen Sammlung auszugeben. Entschuldigt, ich bin neuGruppendokumente nach Filialdokumentenfeld

Ich habe die folgende JSON Struktur in meiner Sammlung

{ 
    "_id" : "1", 
    "parent" : [ 
     { 
      "child" : { 
       "child_id" : "1", 
       "timestamp" : ISODate("2010-01-08T17:49:39.814Z") 
      } 
     } 
    ] 
} 

hier Mongo ist das, was ich habe

db.mycollection.aggregate([ 
     { $project: { child_id: '$parent.child.child_id', timestamp: '$parent.child.timestamp' }}, 
     { $group: { cid: '$child_id', ts: { $max: '$timestmap'} }}, 
     { $out : 'mycollectiongrouped'} 
     ])) 

jedoch versucht, diese Fehler. Irgendwelche Ideen, ich nehme an, dass ich das Projekt wahrscheinlich falsch benutze.

[thread1] Error: command failed: { "ok" : 0, "errmsg" : "the group aggregate field 'cid' must be defined as an expression inside an object", "code" : 15951 } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13

+0

Ihnen fehlt das Feld '_id'. Außerdem sollten Sie ein gültiges Datumsobjekt verwenden. – styvane

+0

danke. bezüglich des validate Datumsobjekts verwende ich ISODate(). Will die Frage entsprechend bearbeiten –

+0

Ist das "Eltern" -Feld immer ein Element-Array? Was ist deine 'Mongod' Version? – styvane

Antwort

1
db.collection.aggregate([ 
    {$group: { 
     _id: "$parent.child.child_id", 
     timestamp: {$max: "$parent.child.timestamp"} 
    }}, 
    {$project: { 
     cid: {$arrayElemAt: ["$_id", 0]}, 
     ts: {$arrayElemAt: ["$timestamp", 0]}, 
     _id: 0 
    }}, 
    {$out: "groupedCollection" } 
]) 

Sie vermissen die _id, die für die $group Pipelinestufe obligatorisch ist. Da das "Eltern" -Feld in Ihrem Dokument ein Elementarray ist, sollte die Stufe $group die erste Stufe in der Pipeline sein.

Wenn Sie die Stufe $group als erste Stufe festlegen, müssen Sie nur ein Dokument pro Gruppe statt aller Dokumente in der Sammlung projizieren.

Beachten Sie, dass die resultierenden Dokumentfelder Array sind daher die Verwendung der $arrayElemAt-Operator in der $project Bühne.

+0

Vielen Dank für die Antwort und Erklärung. Das macht Sinn, jetzt sehe ich es. Habe es dort auf meiner Mongo Collection versucht und es hat gut funktioniert. –

0

Sie benötigen ein _id Feld für die $group. Diese _id legt fest, welche Dokumente gruppiert sind. Wenn Sie beispielsweise nach child_id gruppieren möchten, tun Sie _id: "$child_id". In diesem Fall können Sie das Feld cid weglassen (in diesem Fall können Sie einfach cid in _id ändern).

Verwandte Themen