2017-03-24 4 views
0

Ich versuche, nicht gebundene Filialdokumente zu sortieren. Dies ist die Sammlung:mongodb sort unpopulated Filialdokument

[ 
    { 
     otherFields: {}, 
     visites: ["58d46ffbf1c383862cf5de4a", "58d46ffbf1c383862cf5de49"] 
    } 
] 

Und das ist das Aggregat:

db.exps.aggregate([ 
    { "$match": {} }, 
    { "$project": { "visites": 1 } }, 
    { "$unwind": "$visites" }, 
    { "$sort": { "visites.formVersion": 1 } }, 
    { "$group": { "_id": null, "count": { "$sum": 1 }, "data": { "$push": "$visites" } } } 
]) 

Ich habe erkannt, dass es keinen Sinn, mit einem Unterfeld zu sortieren hat, wie das visites Feld nur ein Array von IDs ist . Ist es möglich, sie im Aggregat zu befüllen, damit sie sortiert werden können?

Die Ergebnisse nach NodeJS Bevölkerung sind diese hier:

{ 
    "count": 50, 
    "data": [ 
     { 
      "_id": "58d46ffbf1c383862cf5de4a", 
      "formVersion": 4, 
      "start": "2017-06-04T07:30:00.000Z", 
      "end": "2017-06-04T08:30:00.000Z", 
      "type": "assessor", 
      "expedient": "58d46ffaf1c383862cf5de41", 
      "user": "58d46ff8f1c383862cf5de3a", 
      "__v": 0, 
      "isDeleted": false, 
      "lastModified": "2017-03-24T01:01:47.343Z", 
      "created": "2017-03-24T01:01:47.330Z" 
     }, 
     { 
      "_id": "58d46ffbf1c383862cf5de49", 
      "formVersion": 3, 
      "start": "2017-06-03T07:30:00.000Z", 
      "end": "2017-06-03T08:30:00.000Z", 
      "type": "assessor", 
      "expedient": "58d46ffaf1c383862cf5de41", 
      "user": "58d46ff8f1c383862cf5de3a", 
      "__v": 0, 
      "isDeleted": false, 
      "lastModified": "2017-03-24T01:01:47.341Z", 
      "created": "2017-03-24T01:01:47.328Z" 
     }, 
+1

[lookup] (https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/) wird helfen – Veeram

Antwort

0

Unter der Annahme, zwei Sammlungen coll1 und coll2:

> db.coll1.find() 

{ 
"_id": ObjectId("58eecf2a11b7af6f560666d8"), 
    "otherFields": { 

}, 
"visites": [ 
    "58d46ffbf1c383862cf5de4a", 
    "58d46ffbf1c383862cf5de49" 
    ] 
} 
> db.coll2.find() 
{ 
    "_id": "58d46ffbf1c383862cf5de4a", 
    "formVersion": 4, 
    "start": "2017-06-04T07:30:00.000Z", 
    "end": "2017-06-04T08:30:00.000Z", 
    "type": "assessor", 
    "expedient": "58d46ffaf1c383862cf5de41", 
    "user": "58d46ff8f1c383862cf5de3a", 
    "__v": 0, 
    "isDeleted": false, 
    "lastModified": "2017-03-24T01:01:47.343Z", 
    "created": "2017-03-24T01:01:47.330Z" 
} 
{ 
    "_id": "58d46ffbf1c383862cf5de49", 
    "formVersion": 3, 
    "start": "2017-06-03T07:30:00.000Z", 
    "end": "2017-06-03T08:30:00.000Z", 
    "type": "assessor", 
    "expedient": "58d46ffaf1c383862cf5de41", 
    "user": "58d46ff8f1c383862cf5de3a", 
    "__v": 0, 
    "isDeleted": false, 
    "lastModified": "2017-03-24T01:01:47.341Z", 
    "created": "2017-03-24T01:01:47.328Z" 
} 

Wenn Sie suchen, zum Beispiel nach dem sortiert werden das formVersion Feld, eine mögliche Aggregat Pipeline Lösung sein könnte: db.coll1.aggregate ([

// left outer join from coll2 to coll1 
{$lookup:{ 
    from:"coll2", 
    localField:"visites", 
    foreignField:"_id", 
    as:"data" 
}}, 

// unwind the resulting array 
{$unwind:"$data"}, 

// sort the unwinded documents using the formVersion field 
{$sort:{"_id":1 ,"data.formVersion": 1}}, 

// collect the results into an array 
{$group:{"_id":null, data:{$push:"$data"}}} 
]) 

Das Ergebnis der Pipeline ist:

{ 
    "_id": null, 
    "data": [ 
    { 
     "_id": "58d46ffbf1c383862cf5de49", 
     "formVersion": 3, 
     "start": "2017-06-03T07:30:00.000Z", 
     "end": "2017-06-03T08:30:00.000Z", 
     "type": "assessor", 
     "expedient": "58d46ffaf1c383862cf5de41", 
     "user": "58d46ff8f1c383862cf5de3a", 
     "__v": 0, 
     "isDeleted": false, 
     "lastModified": "2017-03-24T01:01:47.341Z", 
     "created": "2017-03-24T01:01:47.328Z" 
    }, 
    { 
     "_id": "58d46ffbf1c383862cf5de4a", 
     "formVersion": 4, 
     "start": "2017-06-04T07:30:00.000Z", 
     "end": "2017-06-04T08:30:00.000Z", 
     "type": "assessor", 
     "expedient": "58d46ffaf1c383862cf5de41", 
     "user": "58d46ff8f1c383862cf5de3a", 
     "__v": 0, 
     "isDeleted": false, 
     "lastModified": "2017-03-24T01:01:47.343Z", 
     "created": "2017-03-24T01:01:47.330Z" 
    } 
    ] 
} 

Bitte beachten Sie, dass ab MongoDB 3.4 gibt sind bestimmte Einschränkungen in der $lookup Bühne, wie die beiden Sammlungen müssen in der gleichen Datenbank sein, und der from Parameter kann nicht eine sharded Sammlung sein.Weitere Details finden Sie unter https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/ Beachten Sie auch, dass die letzte $group Bühne würde zu einem einzelnen Dokument führen, das an die 16 MB-Dokumentengröße von MongoDB gebunden ist. Wenn Sie dies vorziehen, können Sie die Stufe $group entfernen und stattdessen den Cursor durchlaufen, der von der Stufe $sort zurückgegeben wird.

+0

Danke, habe deine Antwort nicht verifiziert, aber definitiv habe ich mit '$ lookup beendet 'wie @Veeram vorgeschlagen hat – Miquel

Verwandte Themen