当除以其他变量时,MongoDB除以返回null

时间:2014-05-15 11:06:36

标签: mongodb aggregation-framework

我正在尝试计算一些数字,但是当使用$ divide运算符中的先前计算变量时,MongoDB返回null

这是查询:

db.apps.aggregate(

{$project : {
    a: {$multiply : [2,2]},
    b: {$divide: [5, "$a"]},
    c: {$divide: [5, 4]}

}})

为什么“b”在结果中为空:

/* 0 */
{
    "result" : [ 
        {
            "_id" : ObjectId("5361173d93861f6e5239714e"),
            "a" : 4,
            "b" : null,
            "c" : 1.25
        }, 
        {
            "_id" : ObjectId("536192c1938652d039fa0051"),
            "a" : 4,
            "b" : null,
            "c" : 1.25
        }
    ],
    "ok" : 1
}

修改: 感谢Neil的评论,解决方案是进行第二阶段的$ project

db.apps.aggregate(

{$project : {
    a: {$multiply : [2,2]},
    b: {$divide: [5, "$a"]},
    c: {$divide: [5, 4]}

}},


{$project : {
    a: 1, c:1,
    b: {$divide: [5, "$a"]},   
}}

)

2 个答案:

答案 0 :(得分:1)

$project步骤中的变量始终是该步骤的输入文档的字段。您无法访问在同一步骤中计算的任何值。但您可以在以下$ project步骤中访问任何计算值。因此,您可以将计算分成两个$ project项目步骤:

db.apps.aggregate(
    [
        {   $project : {
                a: { $multiply : [2, 2] }
            }
        },
        {   $project : {
                a: 1,
                b: { $divide: [5, "$a"] }   
            }
        }
    ]
);

答案 1 :(得分:0)

现在您可以使用let了。这样:

db.apps.aggregate([{
    $project: {
        b: {
            $let: {
                vars: {
                    "a": {$multiply: [2,2]}
                },
                in: {$divide: [5, "$$a"]}
            }
        }
    }}
]);