2017-05-13 5 views
2

MongoDB Version 3.4.4

Wie Sie einen neuen Schlüssel ‚Insgesamt‘ aggregieren, deren Wert ist das Produkt aus ‚natürlich‘ und ‚Menge‘ für jede Objekt innerhalb des Array-Snapshots.

Beispieldokument:

{ 
    cur: "EUR", 
    snapshot: [ 
     { 
      id: "24352345", 
      course: 58.12, 
      quantity: 13 
     },  
     { 
      id: "34552345", 
      course: 18.12, 
      quantity: 63 
     } 
    ] 
} 

Wunschergebnis:

{ 
    cur: "EUR", 
    snapshot: [ 
     { 
      id: "24352345", 
      course: 58.12, 
      quantity: 13, 
      total: 755.56 
     },  
     { 
      id: "34552345", 
      course: 18.12, 
      quantity: 63, 
      total: 1141.56 
     } 
    ] 
} 

ersten Versuch:

db.mycoll.aggregate([{ 
    $addFields: { 
     "snapshot.total": { 
      $multiply:["$snapshot.quantity", "$snapshot.course"] 
     } 
    } 
}]) 

„err msg“: "$ mehrfach unterstützt nur numerische Typen, nicht Array"

Zweiter Versuch:

db.mycoll.aggregate([ 
    { "$addFields": { 
     "snapshot.total": { 
      "$map": { 
       "input": "$snapshot", 
       "as": "row", 
       "in": { "$multiply": [ 
        { "$ifNull": [ "$$row.quantity", 0 ] }, 
        { "$ifNull": [ "$$row.course", 0 ] } 
       ]} 
      } 
     } 
    }} 
]) 

Der unerwünschte Wert von 'total' ist ein Array mit den Summen aller Objekte:

{ 
    cur: "EUR", 
    snapshot: [ 
     { 
      id: "24352345", 
      course: 58.12, 
      quantity: 13, 
      total: [ 
       755.56, 
       1141.56 
      ] 
     },  
     { 
      id: "34552345", 
      course: 18.12, 
      quantity: 63, 
      total: [ 
       755.56, 
       1141.56 
      ] 
     } 
    ] 
} 

Antwort

2

Ihr zweiter Versuch ändern Sie den gesamten Snapshot eingebettete Dokument mit seinen Feldern als

db.mycoll.aggregate([ 
    { 
     "$addFields": { 
      "snapshot": { 
       "$map": { 
        "input": "$snapshot", 
        "as": "row", 
        "in": { 
         "id": "$$row.id", 
         "course": "$$row.course", 
         "quantity": "$$row.quantity", 
         "total": { "$multiply": [ 
          { "$ifNull": [ "$$row.quantity", 0 ] }, 
          { "$ifNull": [ "$$row.course", 0 ] } 
         ]} 
        } 
       } 
      } 
     } 
    } 
]) 
zur Karte
Verwandte Themen