【问题标题】:Node.js - how to calculate the aggregate(sum) of sub document in mongodb?Node.js - 如何计算 mongodb 中子文档的聚合(总和)?
【发布时间】:2016-09-09 02:53:27
【问题描述】:

我的收藏结构是,

[{
    "_id": "....",
    "name": "aaaa",
    "level_max_leaves": [{
        level: "ObjectIdString 1",
        max_leaves: 4,
    }]
}, {
    "_id": "....",
    "name": "bbbb",
    "level_max_leaves": [{
        level: "ObjectIdString 1",
        max_leaves: 4,
    }]
}, {
    "_id": "....",
    "name": "cccc",
    "level_max_leaves": [{
        level: "ObjectIdString 1",
        max_leaves: 7,
    }]
}, {
    "_id": "....",
    "name": "dddd",
    "level_max_leaves": [{
        level: "ObjectIdString 2",
        max_leaves: 3,
    }]
}]

现在我需要对具有ObjectIdString 1max_leaves 的字段求和?

还有(4+4+7=15)的结果。

到目前为止我尝试过

var empLevelId = 1234... ;
MyModel.aggregate(
    {$unwind: "$level_max_leaves.level"},
    {$match: {"$level_max_leaves.level": empLevelId } },
    {$group: { "_id": "$level_max_leaves.level", 
               "total": { "$sum": "$level_max_leaves.max_leaves" }}},
    function (err, res) {
        console.log(res);
});

如何做到这一点?

【问题讨论】:

  • $max_leaves 很可能是对象中没有字段,试试$level_max_leaves.max_leaves

标签: node.js mongodb mongoose aggregation-framework


【解决方案1】:

通常在聚合框架中处理数组时,您需要先$unwind 数组内容。这会将内容“反规范化”为单个文档。从这里开始,正常的分组操作按预期工作:

MyModel.aggregate([

    // Unwind to "de-normalize"
    { "$unwind": "$level_max_leaves" },

    // Group as expected
    { "$group": {
        "_id": "$level_max_leaves.level",
        "total": { "$sum": "$level_max_leaves.max_leaves" }
    }}

],function(err,result) {

    // process results here

});

另请注意,寻址元素时需要“绝对”路径。

【讨论】:

  • 是的。现在我又多了一个疑问。如何根据level 对象字符串计算max_leaves 的总数为ObjectIdString 1ObjectIdString 2ObjectIdString 3
  • @Ranjith 不知道你在问什么。这就是上面所做的。返回每个“level”值的“max_leaves”总数。如果您还有其他问题,请随时发布另一个问题。这回答了你问的问题。你可以用另一个问题更清楚地解释你想要什么。
  • 是的。现在我需要过滤总max_leaves 中的特定level。我尝试使用 $match 过滤器选项,例如 $match: {"$level_max_leaves.level": empLevelId } } 。但它没有返回我所期望的。我也编辑了我的问题。
  • @Ranjith 这听起来像是另一个问题。我已经回答了你提出的问题。如果您还有其他需要解释的问题,请发布另一个问题。这样人们就更清楚了。
猜你喜欢
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多