猫鼬嵌套组通过对嵌套字段进行排序

时间:2018-06-22 08:11:24

标签: node.js mongodb mongoose

我的收藏夹中有这样的数据:

{
    "_id" : ObjectId("5b29fc8a0d206c33115cdf87"),
    "Cost" : 20,
    "Desc" : "Cost of purchase",
    "Category" : "C1",
    "Vendor" : "Vendor 2"
}
{
    "_id" : ObjectId("5b29fc8a0d206c33115cdf88"),
    "Cost" : 40,
    "Desc" : "Cost of repairs",
    "Category" : "C1",
    "Vendor" : "Vendor 1",
}........ so on

我想对此进行嵌套聚合,以在Vendor上按以下方式获取数据:

[
    {
        "_id": "Cost of purchase",
        "Value": [
            {
                "Vendor": "Vendor 1",
                "Sum_Cost": 40
            },
            {
                "Vendor": "Vendor 2",
                "Sum_Cost": 20
            }
        ]
    }
]

但是我没有在供应商上对数据进行排序。我正在获取类似的数据:

[
    {
        "_id": "Cost of purchase",
        "Value": [
            {
                "Vendor": "Vendor 2",
                "Sum_Cost": 20
            },
            {
                "Vendor": "Vendor 1",
                "Sum_Cost": 40
            }
        ]
    }
]

这是我到目前为止用Desc和Vendor上的嵌套分组完成的代码,以求总成本。但是我的排序不起作用,因为它假定使用Vendor对对象数组内的数据进行排序:

let aggreArray = [{
  $group: {
      _id: {
          Desc: "$Desc",
          Vendor: "$Vendor"
      },
      sum: {
          "$sum": "$Cost"
      }
  }
}, {
  $group: {
      _id: "$_id.Desc",
      Value: {
          $push: {
              Vendor: "$_id.Vendor",
              value: "$sum"
          }
      }
  }
},{
  $sort: { "Value.Vendor": 1}
}];
db.collection.aggregate(aggreArray).toArray(function (err, docs) {
    console.log(docs);  
});

1 个答案:

答案 0 :(得分:0)

我发现@Ashh的解决方案有效,但只是为了清楚起见,所以我们知道这个问题已经有了解决方案,而不是从评论中读取,我添加了这个答案。

let aggreArray = [{
  $group: {
      _id: {
          Desc: "$Desc",
          Vendor: "$Vendor"
      },
      sum: {
          "$sum": "$Cost"
      }
  }
},
{ $sort: { "Value.Vendor": 1} },
{
  $group: {
      _id: "$_id.Desc",
      Value: {
          $push: {
              Vendor: "$_id.Vendor",
              value: "$sum"
          }
      }
  }
}];
db.collection.aggregate(aggreArray).toArray(function (err, docs) {
    console.log(docs);  
});

基于@Ashh在评论部分的回答。