如何在mongoDB中对多层数组中的值进行分组和计数



我有非常复杂的MongoDB 文档

例如:订单文档>gt>

  {
     "_id": "62cdbae0421b250009acc329",
     "cartitems": "62cdbaaf74c9c80009f5a4b2",
  },
  {
        "_id": "62d27e192b254600099ae680",
       "cartitems": "62d27d9d91568c0009866d23",
  }

以及购物车文档>gt>


 {
   "_id": "62cdbaaf74c9c80009f5a4b2",
    "cartItems": [
          {
                      "productCode": [
                            "NCK-1"
                        ],
                        "Price": "56",
                    },
                    {
                        "productCode": [
                            "NCK-2"
                        ],
                        "Price": "56",
                    }
                ],
 },
 {
   "_id": "62d27d9d91568c0009866d23",
    "cartItems": [
                    {
                      "productCode": [
                            "NCK-3"
                        ],
                        "Price": "56",
                    },
                    {
                        "productCode": [
                            "NCK-1"
                        ],
                        "Price": "56",
                    }
      ],
 },

我想加入带有购物车的订单文档订单分区_id和groupby ProductCode和Count Product Code和Sum Price,即总的来说,结果必须看起来像

NCK-1 112
NCK-2 56NCK-3 56

我尝试了以下代码>gt>

Order.aggregate([
      {
        $lookup: {
          from: Cart.collection.name,
          localField: 'cartitems',
          foreignField: '_id',
          as: 'cartitems',
        },
      },
      { $unwind: '$cartitems' },
      {
        $group: {
          _id: '$cartitems.cartItems.productCode',
          count: { $sum: '$cartitems.cartItems.Price' },
        },
      },
    ]);

我找不到解决方案,请指导我解决这个问题。

  1. $lookup

  2. $unwind

  3. $unwind-将cartitems.cartItems数组分解为多个文档。

  4. $group-由于cartitems.cartItems.productCode中只有一个项,可以考虑使用$first获取数组的第一个值。并且您需要在求和之前将cartitems.cartItems.Price类型强制转换为number类型。

db.order.aggregate([
  {
    $lookup: {
      from: "cart",
      localField: "cartitems",
      foreignField: "_id",
      as: "cartitems"      
    }
  },
  {
    $unwind: "$cartitems"
  },
  {
    $unwind: "$cartitems.cartItems"
  },
  {
    $group: {
      _id: {
        $first: "$cartitems.cartItems.productCode"
      },
      count: {
        $sum: {
          $toInt: "$cartitems.cartItems.Price"
        }
      }   
    } 
  }  
])

Mongo游乐场示例

最新更新