如何获取文档 MangoDB&Mongoose 上的特定字段并聚合一些字段?

Posted

技术标签:

【中文标题】如何获取文档 MangoDB&Mongoose 上的特定字段并聚合一些字段?【英文标题】:How to get specific fields on document MangoDB&Mongoose and aggregate some of the fields? 【发布时间】: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
 
] 

【问题讨论】:

【参考方案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 字段?

以上是关于如何获取文档 MangoDB&Mongoose 上的特定字段并聚合一些字段?的主要内容,如果未能解决你的问题,请参考以下文章

mangoDB

nodejs下值mangoDB

mangodb与mysql的区别及部署

开源SPL强化MangoDB计算

全新版本MongoDB数据存储席卷物联网(转载)

如何在WindowsAzure上搭建Mean stack环境之如何在中国版Azure上搭MangoDB