MongoDB 如何形成查询以获得最畅销产品的排名

MongoDB how to form a query to get top selling products ranked

我的 mongodb 数据库中有订单模式,我想获得从最高到最低排名的最畅销产品,这是文档的样子:

所以,可以看出有一个shopping_cart是一个产品数组,可以通过[=30=来区分] 他们每个人都有数量(价格无关)。我试过形成这个查询:

 db.orders.aggregate([
{
    $project : {
        "_id" : 0,
        "shopping_cart.product_name" : 1,
        "shopping_cart.qty" : 1,
    }
  }
 ])

结果我得到了这个:

{ shopping_cart: 
  [ 
   { product_name: 'Seven Days', qty: 2 },
   { product_name: 'Cockta 0.33l', qty: 3 },
   { product_name: 'Marbo Chips', qty: 3 },
   { product_name: 'Coca Cola 2l', qty: 1 } 
   ]}
{ shopping_cart: 
   [
    { product_name: 'Seven Days', qty: 2 },
    { product_name: 'Coca Cola 2l', qty: 1 } 
   ]}
{ shopping_cart: 
   [
    { product_name: 'Integral Cookie', qty: 4 },
    { product_name: 'Seven Days', qty: 2 },
    { product_name: 'Marbo Chips', qty: 1 },
    { product_name: 'Coca Cola 2l', qty: 4 } 
    ]}

我想得到这样的输出(我在这里编造数据):

  { top_selling_products :  [
     'Integral Cookie','Coca Cola 2l','Marbo Chips''Seven Days'
   ]}
  • $unwind放松shopping_cart
  • $group 按 product_name 分组并求和数量
  • $sort 按总和排序
  • $group 将所有分组并将名称推入数组

汇总

db.collection.aggregate([
  {
    "$unwind": "$shopping_cart"
  },
  {
    "$group": {
      "_id": "$shopping_cart.product_name",
      "sum": {
        "$sum": "$shopping_cart.qty"
      }
    }
  },
  {
    "$sort": {
      sum: -1
    }
  },
  {
    "$group": {
      "_id": null,
      "top_selling_products ": {
        $push: "$_id"
      }
    }
  }
])

数据

[
  {
    shopping_cart: [
      {
        product_name: "Seven Days",
        qty: 2
      },
      {
        product_name: "Cockta 0.33l",
        qty: 3
      },
      {
        product_name: "Marbo Chips",
        qty: 3
      },
      {
        product_name: "Coca Cola 2l",
        qty: 1
      }
    ]
  },
  {
    shopping_cart: [
      {
        product_name: "Seven Days",
        qty: 2
      },
      {
        product_name: "Coca Cola 2l",
        qty: 1
      }
    ]
  },
  {
    shopping_cart: [
      {
        product_name: "Integral Cookie",
        qty: 4
      },
      {
        product_name: "Seven Days",
        qty: 2
      },
      {
        product_name: "Marbo Chips",
        qty: 1
      },
      {
        product_name: "Coca Cola 2l",
        qty: 4
      }
    ]
  }
]

结果

[
  {
    "_id": null,
    "top_selling_products ": [
      "Seven Days",
      "Coca Cola 2l",
      "Integral Cookie",
      "Marbo Chips",
      "Cockta 0.33l"
    ]
  }
]

mongoplayground