2016-07-06 5 views
4

Was ich habe

Ich habe die folgenden Dokumente zu meiner Aggregation Pipeline kommen:Wie berechne ich Felder in einem Array von Objekten?

[ 
    { 
     "email" : "[email protected]", 
     "name" : "Organization Name", 
     "users" : [ 
      { 
       "lastName" : "Nye", 
       "firstName" : "Bill", 
       "email"  : "[email protected]" 
      }, 
      { 
       "lastName" : "Rogers", 
       "firstName" : "Mr.", 
       "email"  : "[email protected]" 
      } 
     ] 
    }, 
    ... 
] 

Was ich will

$project verwenden möchte ich die firstName und lastName Felder in jedem der Arrays $concat Unterdokumente, um das folgende Ergebnis zu erhalten:

{ 
    "email" : "[email protected]", 
    "name" : "Organization Name", 
    "users" : [ 
     { 
      "name" : "Bill Nye", 
      "email" : "[email protected]" 
     }, 
     { 
      "name" : "Mr. Rogers", 
      "email" : "[email protected]" 
     } 
    ] 
} 

Was ich habe versucht - Versuch # 1

Ich habe die folgende Aggregation versucht:

db.organizations.aggregate([ 
    { 
     $project: { 
      email : 1, 
      name : 1, 
      users : { 
       name : { $concat : [ "$users.firstName", " ", "$users.lastName" ] }, 
       email : 1 
      } 
     } 
    } 
]); 

... aber ich bekomme die folgende Fehlermeldung:

$concat only supports strings, not Array

Was ich habe versucht - Versuch # 2

ich habe auch versucht die folgende Aggregation:

db.organizations.aggregate([ 
    { 
     $project: { 
      email : 1, 
      name : 1, 
      users : { 
       name : { $concat : [ "$firstName", " ", "$lastName" ] }, 
       email : 1 
      } 
     } 
    } 
]); 

... aber name gibt immer null zurück.

Ich fühle mich als ob das eine relativ einfache Sache sein sollte, aber ich bin völlig ratlos.

Wie bekomme ich die Ergebnisse, nach denen ich suche?

Antwort

6

können Sie einfach das tun, indem $project Ihre Dokumente ing und verwenden Sie die $map Aggregation variable Bediener den $concat Ausdruck zu jedem Element in einem Array anzuwenden und gibt ein Array mit den aufgebrachten Ergebnisse.

db.organizations.aggregate(
    [ 
     { "$project": { 
      "email": 1, 
      "name": 1, 
      "users": { 
       "$map": { 
        "input": "$users", 
        "as": "u", 
         "in": { 
          "name": { "$concat" : [ "$$u.firstName", " ", "$$u.lastName" ] }, 
          "email": "$$u.email" 
         } 
       } 
      } 
     }} 
    ] 
) 
+0

Während diese Antwort genauso gut funktioniert wie die Antwort von @ chridam und das Problem aus einem anderen Blickwinkel angeht, habe ich seine Lösung verwendet. Vielen Dank für Ihre Zeit! – docksteaderluke

+0

@docksteaderluke Ich wusste, dass du diese Lösung verwenden wirst;) denn trotz der Tatsache, dass die andere Antwort "sachlich richtig" ist, ist es definitiv nicht der richtige Weg. – styvane

+0

Pflege um zu erarbeiten? Warum ist es nicht der richtige Weg? – docksteaderluke

Verwandte Themen