首页 > 解决方案 > Mongoose groupBy 多个值

问题描述

我正在努力与多个 groupBy 和猫鼬一起工作。

我的收藏看起来像这样

{
  salesPersonName:"Tim",
  zone:"1",
  buyerName:"Jim's Shop",
  cost:1000
},{
  salesPersonName:"Tim",
  zone:"1",
  buyerName:"Jim's Shop",
  cost:1000
},
{
  salesPersonName:"Barb",
  zone:"1",
  buyerName:"Jim's Shop",
  cost:3000
},
{
  salesPersonName:"Tim",
  zone:"2",
  buyerName:"Petra's Shop",
  cost:7000
}

我试图按每个销售人员按区域查找总成本。因此,对于每个有买家的区域,计算每个销售人员的总成本。

结果:

Zone     buyerName      salesPerson cost

1        Jim's Shop     Tim         2000
                        Barb        3000

2        Petra's Shop   Tim         7000

先感谢您

标签: node.jsmongoose

解决方案


假设您在 db 中的集合名为sales,然后正确使用模式和模型:

const SaleSchema = new Schema({
  salesPersonName:{
    type: String
  },
  zone:{
    type: String
  },
  buyerName:{
    type: String
  },        
  cost:{
    type: Number
  }
});

const Sale = mongoose.model('Sale', SaleSchema);

然后,您应该使用所有三个字段定义聚合正确的 aggreget key _id,并cost为总和添加新属性。聚合查询如下所示:

Sale.aggregate([{$group: {
    _id:{
      zone:"$zone", 
      buyerName:"$buyerName", 
      salesPersonName:"$salesPersonName"}
    "cost":{$sum:"$cost"}}
  }, 
  {$sort: {"cost": 1}}]
);

当然,排序不是强制性的,结果的属性名称(salesPersonName、zone、...)可以有任何其他名称。另一方面请注意,$我们正在定义属性的路径,$zone表示集合的区域属性sales等。


推荐阅读