Mongodb 基于数组值的聚合

Mongodb 基于数组值的聚合,mongodb,mongodb-query,aggregates,Mongodb,Mongodb Query,Aggregates,我的收集模式如下: { "_id" : ObjectId("582ee289618a504e5c830e03"), "updatedAt" : ISODate("2016-11-24T05:01:59.470Z"), "createdAt" : ISODate("2016-11-18T11:14:17.912Z"), "requestId" : "IER5R2H", "pickupDetails" : { "_id" : ObjectId("58367447b0a1ada74ad7af7

我的收集模式如下:

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

    ]
}}
我需要根据皮卡物品的名称添加数量,如“报纸”等。假设某一天的报纸数量。 根据下面的数据,对于特定的日期,结果应该类似于,{“paper”:33}。

试试这个:

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

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

您可以在管道开始处添加$match阶段,以获得特定日期的结果

是否有可能在同一阵列中添加两份报纸(如不同的单价)?你想知道发生的次数吗?或者数量的总和?不,不可能有两份报纸在同一个数组中,我想要“pickupItems”数量的总和。就像{{“报纸”:33},{“塑料”:4}谢谢菲利克斯!它解决了我的问题。顺便问一下,这有什么用$unwind@SachinBhandari$unwind从输入文档解构数组字段,为每个元素输出一个文档,因此数组中的每个项都有一个文档