MongoDB:$推送$ group中的计算表达式

时间:2013-07-25 20:43:18

标签: mongodb aggregation-framework

我希望将计算表达式作为$group操作的一部分推送到数组而不是值本身。 MongoDB可以这样做吗?

例如,如果我有一个名为c的集合,其中包含以下文档:

{ "k" : 1, "v" : true }
{ "k" : 1, "v" : true }
{ "k" : 1, "v" : false }
{ "k" : 1, "v" : true }
{ "k" : 1, "v" : false }

然后我可以像这样进行聚合以获取数组中的所有v值:

db.c.aggregate({$group: {_id:'$k', vals: {$push: '$v'}}})

{
    "result" : [
        {
            "_id" : 1,
            "vals" : [
                true,
                true,
                false,
                true,
                false
            ]
        }
    ],
    "ok" : 1
}

但是,如果不是实际的truefalse值,我想将它们更改为'red''green'?也许是这样的事情:

db.c.aggregate({$group: {_id:'$k', vals: {$push: '$v' ? 'red' : 'green'}}})

但是,这只是输出所有'red'。是否可以在$push表达式中计算任意值?

1 个答案:

答案 0 :(得分:3)

您可以使用$condhttp://docs.mongodb.org/manual/reference/aggregation/cond/#exp._S_cond):

db.c.aggregate( [
    { $project: {
        k: '$k',
        color: {
            $cond: [ 
                { $eq: [ '$v', true ] }, 
                'red', 
                'green'
            ]
        }
    } },
    { $group: {
        _id: '$k',
        vals: { '$push': '$color' }
    } }
] )

修改

正如另一个编辑提到的那样,它实际上需要$eq才能工作,因为{'$v':true}不会被视为正确的表达。