2

我想将计算表达式推送到数组而不是值本身作为$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
}

但是,如果我想将它们更改为,比如说,而不是实际值和值,该true怎么办?也许是这样的:false'red''green'

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

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

4

1 回答 1

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}没有被评估为正确的表达式。

于 2013-07-25T20:50:03.473 回答