2016-12-28 3 views
0

i in MongoDB neu und ich habe einen Documment in Mongo mit dieser Struktur:Gruppe von Schlüsseln in Array, das in einem Dokument ist

{  
"game" : "chess", 
"name" : "Chess", 
"prizes" : [ 
    { 
     "_id" : ObjectId("562575c61d41c81efce7bc1b"), 
     "group" : 0, 
     "name" : "10 coins", 
     "pos" : "0", 
    }, 
    { 
     "_id" : ObjectId("562575c61d41c81efce7bc1c"), 
     "group" : 0, 
     "name" : "10 coins", 
     "pos" : "1", 
    }, 
    { 
     "_id" : ObjectId("562575c61d41c81efce7bc1d"), 
     "group" : 1, 
     "name" : "20 coins", 
     "pos" : "2", 
    }, 
} 

Ich brauche einige wie folgt zu erhalten:

{  
"game" : "chess", 
"name" : "Chess", 
"prizes" : [ 
    { 
     "name" : "10 coins", 
     "group" : 0, 
    }, 
    { 
     "name" : "20 coins", 
     "group" : 1, 
    } 

Ich versuche mit Aggregat und Projektion und entspanne mich, aber ich bekomme nicht die Struktur, die ich brauche, danke.

+0

Veröffentlichen Sie die Aggregation, die Sie in Ihrer Frage versucht haben. – ThrowsException

Antwort

0

Sie können versuchen, wie unten. Verwenden Sie $ map mit einer set-Operation $ setUnion oder $ setDifference, die nur benötigt wird, um Duplikate zu filtern, während die Form transformiert wird.

aggregate([{ 
    "$project": { 
     "game": 1, 
     "name": 1, 
     "prizes": { 
      "$setUnion": [{ 
        "$map": { 
         "input": "$prizes", 
         "as": "prize", 
         in: { 
          "name": "$$prize.name", 
          "group": "$$prize.group" 
         } 
        } 
       }, 
       [] 
      ] 
     } 
    } 
}]).pretty(); 
+0

Ihre Antwort funktioniert zu, danke –

1

Grundsätzlich bin ich abwickeln und dann bekommen die Preise Array nur auf die Felder, die Sie auf der Grundlage Ihrer Fragen gewünschte Ausgabe. dann gruppieren Sie alle zusammen mit dem Spiel und benennen Sie und verwenden Sie $ addToSet, um eindeutige ganze Gruppen und Namen in das Array einzufügen. Ich nehme an, dass es keine Duplikate gibt, aber ich denke, es würde trotzdem funktionieren, da sie alle zusammen gruppiert werden würden.

db.docs.aggregate([ 
    {$unwind : '$prizes'}, 
    {$project: {name: '$name', game: '$game', prizes: {group: '$prizes.group', name: '$prizes.name'}}}, 
    {$group: {_id: {name: '$name', game: '$game'}, prizes: {$addToSet: '$prizes'}}}, 
]) 
+0

Vielen Dank, dieses Aggregat hat funktioniert! –

Verwandte Themen