我想$project
如果某个字段存在,但不是它的值,使用mongoose
model
aggregate
查询。
如果可以在$exists
中使用$cond
,则看起来像这样:
$project: {
b: {
$cond: {
if : {$exists: ['$b', true]},
then : true,
else : false
}
}
}
但是,我必须在boolean
运算符中使用$cond
表达式。
在MongoDB shell中,我可以做类似的事情:
{$eq: ['$b', undefined]}
并且它会产生预期的结果,但由于某种原因,mongoose
模型aggregate
会产生true
。
例如,如果我有以下文件:
{
"a" : 1,
"b" : 2
},
{
"a" : 1
}
我需要以下结果:
{
"b": true
},
{
"b": false
}
如何使用mongoose
做出类似的事情?
答案 0 :(得分:6)
$exists
查询不支持 aggregate
。因此,在aggregate
查询中,而不是$exists
可以使用$ifNull
。
语法:
{ $ifNull: [ <expression>, <replacement-expression-if-null> ] }
<强>更新强>
获取b
值true
或false
可以尝试此查询
db.test.aggregate([
{
$project: {
b: {
$cond: [
{$ifNull: ['$b', false]}, // if
true, // then
false // else
]
}
}
}
])
<强>解释强>
b = $cond: [ 'if condition satisfied', 'then true', 'else false' ];
其中condition = {$ifNull: ['$b', false]}
如果$b
不存在,则condition = false
另有condition = true
。
所以如果condition = true
然后返回,那么结果就意味着b = true
如果condition = false
则返回其他结果表示b = false
答案 1 :(得分:0)
您可以针对此案例使用两个$project
语句,并使用$ifNull运算符(some_field
设置为false
时无法正常工作,在这种情况下,您可以将内部false
更改为更合适的内容
[
{
$project: {
test: {
$ifNull: [
'$some_field',
false
]
}
}
},
{
$project: {
test: {
$cond: {
if : {$eq: ['$test', false]},
then : false,
else : true
}
}
}
}
])