【问题标题】:How to get specific fields on document MangoDB&Mongoose and aggregate some of the fields?如何获取文档 MangoDB&Mongoose 上的特定字段并聚合一些字段?
【发布时间】:2021-12-08 10:38:11
【问题描述】:

我的数据如下所示:

[
   {
      "_id":"61717cafd351f3ae8b6d205a",
      "restaurant":"Hogwarts",
      "purchasedAt":"2021-10-20T17:47:40.166Z",
      "products":[
         {
            "name":"Meat Samosa",
            "price":3.95,
            "quantity":1,
            "_id":"61717cafd351f3ae8b6d205b"
         },
         {
            "name":"Pilau Rice",
            "price":2.95,
            "quantity":1,
            "_id":"61717cafd351f3ae8b6d205f"
         }
      ]
   },
   {
      "_id":"61717cb2d351f3ae8b6dd05b",
      "restaurant":"Hogwarts",
      "purchasedAt":"2021-10-20T03:14:11.111Z",
      "products":[
         {
            "name":"Pilau Rice",
            "price":2.95,
            "quantity":1,
            "_id":"61717cb2d351f3ae8b6dd05d"
         }
      ]
   },
]

我正在尝试查找一个查询,该查询将为我提供所有产品(无重复)及其数量的总和。请注意,即使它们相同(相同名称),产品 id 也是不同的 理想情况下,我的回复应该是这样的

[
  { 
    name: "Meat Samosa",
    price: 3.95,
    quantity: 1
 },
 {
   name: "Pilau Rice",
   price: 2.95,
   quantity: 2
 }
] 

【问题讨论】:

    标签: database mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:
    • $project 显示必填字段
    • $unwind 解构 products 数组
    • $group by name 并获得第一个 price 并计算 quantity 总和
    • $project 显示必填字段
    db.collection.aggregate([
      {
        $project: {
          _id: 0,
          products: 1
        }
      },
      { $unwind: "$products" },
      {
        $group: {
          _id: "$products.name",
          price: { $first: "$products.price" },
          quantity: { $sum: "$products.quantity" }
        }
      },
      {
        $project: {
          _id: 0,
          name: "$_id",
          price: 1,
          quantity: 1
        }
      }
    ])
    

    Playground

    【讨论】:

    • 这正是我所需要的。太感谢了!请问,如何根据数量字段对聚合结果进行降序排序?
    • 你可以使用$sort阶段最后{ $sort: { quantity: -1 } },降序-1和升序1。
    • 您将如何处理仅退回两天前购买的产品?以及在响应中包含restaurantpurchasedAt 字段?
    猜你喜欢
    • 2021-10-08
    • 2016-04-11
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2019-01-17
    • 2019-10-05
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多