2016-12-12 2 views
0

Ich versuche, meine Dokumente wie unten dargestellt zu transformieren. Ich habe versucht, mit dem $unwind Operator, dann die $group Operator kombiniert mit dem $push Operator, um die $user_mentions Array neu zu erstellen, aber dies schiebt auch alle leeren Arrays und ich bin wieder auf Platz eins wieder.Wie werden verschachtelte Arrays geglättet und leere Arrays nur dann entfernt, wenn sie mit dem MongoDB-Aggregationsframework verschachtelt sind?

Was fange ich mit:

{ 
    _id: "6222407", 
    name: "Chris", 
    user_mentions: [ 
    [], 
    [{_id:"963222", name: "Bob"}, {_id:"234324", name: "Fred"}] 
    ] 
}, 
{ 
    _id: "34566", 
    name: "Tim", 
    user_mentions: [ 
    [] 
    ] 
}, 
{ 
    _id: "65343", 
    name: "Sean", 
    user_mentions: [ 
    [], 
    [] 
    ] 
} 
} 

Was ich will:

{ 
    _id: "6222407", 
    name: "Chris", 
    user_mentions: [ 
    {_id:"963222", name: "Bob"}, 
    {_id:"234324", name: "Fred"}] 
    ] 
}, 
{ 
    _id: "34566", 
    name: "Tim", 
    user_mentions: [ 

    ] 
}, 
{ 
    _id: "65343", 
    name: "Sean", 
    user_mentions: [ 

    ] 
} 

Antwort

2

Aufgrund der Art des Dokuments Layout Sie haben zweimal (Array in Array) zu entspannen. Verwenden Sie auch die preserveNullAndEmptyArrays beim zweiten Abwickeln, um leere Arrays in den Dokumenten zu halten.

Hier ist die Zusammenfassung:

db.collection.aggregate(
    [ 
    { 
     $unwind: "$user_mentions" 
    }, 
    { 
     $unwind: { path: "$user_mentions", preserveNullAndEmptyArrays: true } 
    }, 
    { 
     $group: { 
     _id : "$_id", 
     name : {$first : "$name"}, 
     user_mentions : { $push : "$user_mentions"} 
     } 
    } 
    ]  
); 
+0

Das sieht aus wie es ist, was ich will. :) Ich bekomme 3,2, um diese zweite Funktion von $ unwind zu testen. –

+0

Für andere Leser: Sie benötigen MongoDB Version 3.2. Ich hatte Probleme, 3.2 auf Ubuntu 14.04 richtig laufen zu lassen, hatte aber glücklicherweise auch einen Windows-PC. –

+1

Wenn Sie es auf einem 3.2 MongoDB vorhaben, können Sie eine Projektstufe mit einem $ cond hinzufügen, um ein leeres Array zu erstellen, wenn keines vorhanden ist. Bei Bedarf kann ich der Antwort ein Beispiel hinzufügen. – HoefMeistert

Verwandte Themen