2016-12-21 3 views
2

У меня есть коллекция схемы, как:Совокупные на основе значения массива

{ 
"_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") 
     } 

    ] 
}} 

Мне нужно добавить количество на основе имени pickupItems, как «газета» и т.д. Предположим, что количество газеты на определенный день. Согласно приведенным ниже данным, результат должен быть следующим: {«Газета»: 33}, для конкретной даты.

+0

есть возможность две газеты в том же массиве (например, с разными единицами цен)? и вы хотите подсчет случаев? или суммы 'количества'? –

+0

Нет никакой возможности двух газет в одном массиве, и я хочу получить сумму количества «pickupItems». например {{«Газета»: 33}, {«Пластик»: 4}} –

ответ

2

попробовать это:

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

выход:

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

вы можете добавить этап $ матча в начале трубопровода, чтобы получить результаты для конкретного дня

+0

Спасибо, Феликс! Это решило мою проблему. btw, что такое использование $ unwind –

+0

@SachinBhandari $ unwind деконструирует поле массива из входных документов для вывода документа для каждого элемента, поэтому у вас есть документ для каждого элемента массива – felix

Смежные вопросы