2016-12-21 2 views
2

Ich habe Sammlung Schema wie:Aggregate auf Basis von Array-Wert

{ 
"_id" : ObjectId("582ee289618a504e5c830e03"), 
"updatedAt" : ISODate("2016-11-24T05:01:59.470Z"), 
"createdAt" : ISODate("2016-11-18T11:14:17.912Z"), 
"requestId" : "IER5R2H", 
"pickupDetails" : { 
    "_id" : ObjectId("58367447b0a1ada74ad7af7e"), 
    "itemsCount" : 1, 
    "pickupItems" : [ 
     { 
      "name" : "Newspaper", 
      "quantity" : 15, 
      "unit" : "kg", 
      "unitPrice" : 9, 
      "amount" : 135, 
      "_id" : ObjectId("58367447b0a1ada74ad7af7f") 
     } 
    ] 
}} 

{ 
"_id" : ObjectId("58fff31a618a504e5c831191"), 
"updatedAt" : ISODate("2016-11-21T13:37:51.267Z"), 
"createdAt" : ISODate("2016-11-19T06:37:14.857Z"), 
"requestId" : "M7OZY9O", 
"pickupDetails" : { 
    "_id" : ObjectId("5832f8afb8ec77fa3c518f97"), 
    "itemsCount" : 2, 
    "pickupItems" : [ 
     { 
      "name" : "Newspaper", 
      "quantity" : 18, 
      "unit" : "kg", 
      "unitPrice" : 11, 
      "amount" : 198, 
      "_id" : ObjectId("5832f8afb8ec77fa3c518f98") 
     }, 
     { 
      "name" : "Plastic", 
      "quantity" : 4, 
      "unit" : "kg", 
      "unitPrice" : 11, 
      "amount" : 44, 
      "_id" : ObjectId("584a853e46c71be3585bfb5a") 
     } 

    ] 
}} 

Ich brauche die Menge hinzuzufügen, auf dem Namen des pickupItems basiert wie „Zeitung“ usw. Es wäre Menge Zeitung für einen bestimmten Tag. Gemäß den folgenden Daten sollte das Ergebnis für ein bestimmtes Datum wie {"Newspaper": 33} aussehen.

+0

gibt es die Möglichkeit von zwei Zeitungen im selben Array (wie bei verschiedenen unitPrice)? und willst du das Auftreten zählen? oder Summe der "Menge"? –

+0

Nein, es gibt keine Möglichkeit von zwei Zeitungen in der gleichen Reihe und ich möchte die Summe der Menge von 'pickupItems'. wie {{"Zeitung": 33}, {"Plastik": 4}} –

Antwort

2

versuchen Sie dies:

db.collection.aggregate([ 
    { 
     $unwind:"$pickupDetails.pickupItems" 
    }, 
    { 
     $group:{ 
     _id:"$pickupDetails.pickupItems.name", 
     quantity:{ 
      $sum:"$pickupDetails.pickupItems.quantity" 
     } 
     } 
    } 
]) 

Ausgang:

{ "_id" : "Plastic", "quantity" : 4 } 
{ "_id" : "Newspaper", "quantity" : 33 } 

Sie einen $ Match Bühne am Anfang der Pipeline hinzufügen, können die Ergebnisse für einen bestimmten Tag zu bekommen

+0

Danke felix! Es hat mein Problem gelöst. btw, was ist die Verwendung von $ unload –

+0

@SachinBhandari $ unwind dekonstruiert ein Array-Feld aus den Eingabedokumenten, um ein Dokument für jedes Element auszugeben, so dass Sie für jedes Element im Array ein Dokument haben – felix

Verwandte Themen