我希望将计算表达式作为$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'}}})
但是,这只是输出所有'red'
。是否可以在$push
表达式中计算任意值?
答案 0 :(得分:3)
您可以使用$cond
(http://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}
不会被视为正确的表达。