【问题标题】:MongoDB group elements in an arrayMongoDB 对数组中的元素进行分组
【发布时间】:2020-05-24 17:29:53
【问题描述】:

对于每个 product_id,我想要所有订单中的价格总和以及我想要实现的另一个结果是同一数组中具有相同 id 的产品的价格总和。

\\orders collection:
{
order_id: 123,
customer_id: 1,
order_items: [{product_id:1, price: 2}, {product: 4, price: 8}, {product_id:1, price: 2}]
},
{
order_id: 124,
customer_id: 5,
order_items: [{product_id:5, price: 7}, {product: 4, price: 8}]
}

我想要的第一个结果:

{product_id: 1, tot_price: 4}, 
{product_id: 4, tot_price: 16},
{product_id: 5, tot_price: 7}

第二个结果:

{order_id:123,
product_tot: [{product_id:1, tot_price: 4}, {product: 4, tot_price: 8}]},
{order_id:124,
product_tot: [{product_id:5, tot_price: 7}, {product: 4, tot_price: 8}},

【问题讨论】:

    标签: mongodb group-by embedded-database


    【解决方案1】:

    尝试以下查询:

    对于第一个结果:

    db.collection.aggregate([
      {
        $unwind: {
          path: "$order_items",
          preserveNullAndEmptyArrays: true
        }
      },
      {
        $group: {
          _id: "$order_items.product_id",
          tot_price: {
            $sum: "$order_items.price"
          }
        }
      },
      {
        $project: {
          _id: 0,
          product_id: "$_id",
          tot_price: 1
        }
      }
    ])
    

    MongoPlayGroundLink

    第二个结果:

    db.collection.aggregate([
      {
        $unwind: {
          path: "$order_items",
          preserveNullAndEmptyArrays: true
        }
      },
      {
        $group: {
          _id: {
            order_id: "$order_id",
            product_id: "$order_items.product_id"
          },
          tot_price: {
            $sum: "$order_items.price"
          }
        }
      },
      {
        $project: {
          _id: 0,
          order_id: "$_id.order_id",
          product_id: "$_id.product_id",
          tot_price: "$tot_price"
        }
      },
      {
        $group: {
          _id: "$order_id",
          product_tot: {
            $push: {
              product_id: "$product_id",
              tot_price: "$tot_price"
            }
          }
        }
      },
      {
        $project: {
          _id: 0,
          order_id: "$_id",
          product_tot: 1
        }
      }
    ])
    

    MongoPlayGroundLink

    【讨论】:

    • 感谢您的回答,但它不起作用,它返回,在 0 毫秒内获取 0 条记录
    • 您是否检查了 MongoPlayGroundLink 链接,它在 OP 中按要求工作...
    • 是的,它有效!集合的名称不同。非常感谢!
    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多