2016-06-30 12 views
2

Ich habe Array von Objekten (verschachtelt), und ich möchte ein paar Elemente aus diesen verschachtelten Objekte ziehen und diese Felder in einem Array zurückgeben. Unten ist meine Dokumentstruktur (es von den ursprünglichen Daten verspottet)MongoDB-Projekt in ein Array

"detailLine": [ 
    { 
     "name": "first", 
     "value": { 
      "lineNumber": 1, 
      "subLineCode": " ", 
      "detailLineCharges": { 
       "allowedAmount": { 
        "amount": "11111", 
        "reasonCode": “aaaah” 
       } 
      } 
     } 
    }, 
    { 
     "name": "first", 
     "value": { 
      "detailLineCharges": { 
       "allowedAmount": { 
        "amount": "22222", 
        "reasonCode": “BBBB” 
       } 
      } 
     } 
    } 
] 

ich meine Ergebnisse möchte etwas sehen, wie dies

details: [ 
    { 
    amount:”11111”, 
    reasonCode : “aaaah” 
    }, 
    { 
    amount : “22222”, 
    reasonCode : “BBBB” 
    } 
] 

I

versuchte
db.collection.aggregate([ 
    { 
    $match: { 
     _id: "123456" 
    } 
    }, 
    { 
    $project: { 
     details: { 
     $push { 
      amount: "$detailLine.value.detailLineCharges.allowedAmount.amount", 
      reasoncode: "$detailLine.value.detailLineCharges.allowedAmount.reasonCode" 
     } 
     } 
    } 
    } 
]) 

aber ich dies immer Fehler

Error: command failed: { "ok" : 0, "errmsg" : "invalid operator '$push'", "code" : 15999 } : aggregate failed : 

Ich möchte $project verwenden, weil ich es verwende, um zu viele andere Felder zu ziehen, deshalb habe ich $group für dieses eine bestimmte Szenario nicht versucht.

Kann jemand helfen, wie man diese zwei Felder in einem Array bekommt?

Antwort

4

Nun, alles, was Sie brauchen, ist $project Ihre Dokumente und "umformen", um sie mit dem $map Operator.

db.coll.aggregate( 
    [ 
     { "$match": { "_id": "123456" } }, 
     { "$project": { 
      "detailLine": { 
       "$map": { 
        "input": "$detailLine", 
        "as": "dline", 
        "in": { 
         "amount": "$$dline.value.detailLineCharges.allowedAmount.amount", 
         "reasonCode": "$$dline.value.detailLineCharges.allowedAmount.reasonCode" 
        } 
       } 
      } 
     }} 
    ] 
) 
1

Mit der folgenden Pipeline gibt es das gewünschte Ergebnis, obwohl ich $group verwende. Natürlich müssen Sie möglicherweise die Gruppenkennung anpassen.

db.getCollection('yourCollection').aggregate([ 
    {  
     $unwind: { 
      path: "$detailLine" 
     } 
    }, 
    { 
     $project: { 
      allowedAmount: "$detailLine.value.detailLineCharges.allowedAmount" 
     } 
    }, 
    { 
     $group: { 
      _id: "x", 
      details: { 
       $push: "$allowedAmount" 
      } 
     } 
    } 
]) 

Ergebnis

{ 
    "_id" : "x", 
    "details" : [ 
     { 
      "amount" : "11111", 
      "reasonCode" : "aaaah" 
     }, 
     { 
      "amount" : "22222", 
      "reasonCode" : "BBBB" 
     } 
    ] 
} 
+2

OP speziell sagte er nicht $ Gruppe –

+1

Nein, er sagte verwenden will er wollte $ project bc von der Anzahl der Felder verwenden und versuchte daher nicht $ group. Ich interpretiere es als seine klare Präferenz verwendet $ Projekt, aber nicht als $ Gruppe darf nicht verwendet werden. Deshalb schrieb ich 'obwohl ich $ group' verwende; Es war die beste Anstrengung, bis es noch helfen kann. Da es jetzt eine Antwort ohne $ -Gruppe gibt, sehe ich kein Problem, da dieses zu Recht angenommen wurde. – DAXaholic

+1

DAXaholic, danke für die Arbeit. Ich schätze es. – JBone

0

Sie haben vergessen, einen Doppelpunkt in $ Push hinzufügen

$project: { 
    details: { 
    $push { 
     amount: "$detailLine.value.detailLineCharges.allowedAmount.amount", 
     reasoncode: "$detailLine.value.detailLineCharges.allowedAmount.reasonCode" 
    } 
    } 
} 

zu

geändert
$project: { 
    details: { 
    $push: { 
     amount: "$detailLine.value.detailLineCharges.allowedAmount.amount", 
     reasoncode: "$detailLine.value.detailLineCharges.allowedAmount.reasonCode" 
    } 
    } 
}