Python 在mongoDB聚合中使用$match中的$cond
我尝试在聚合的一个阶段使用$match中的$cond,如下所示:Python 在mongoDB聚合中使用$match中的$cond,python,mongodb,aggregation-framework,Python,Mongodb,Aggregation Framework,我尝试在聚合的一个阶段使用$match中的$cond,如下所示: { "$match" : { "field1" : { "$cond" : { "if" : { "$eq" : [ "$id" , 1206]}, "then" : 0, "else" : 1545001200 } },
{ "$match" : {
"field1" : {
"$cond" : {
"if" : { "$eq" : [ "$id" , 1206]},
"then" : 0,
"else" : 1545001200
}
},
"field2" : value2 }}
但我有一个错误:
Error:
Assert: command failed: {
"ok" : 0,
"errmsg" : "unknown operator: $cond",
"code" : 2,
"codeName" : "BadValue"
} : aggregate failed
mongodb版本是3.4.4。
对这个问题有什么想法吗?对于后来遇到这个问题的人: 这对3.4.4不起作用。但是在MongoDB 3.6中,他们引入了$expr操作符,允许您在$match查询中使用$cond和其他操作 有关示例,请参见iamfrank的回答
此外,正如评论中提到的,您可以在以后继续这样做。但理想情况下,您希望尽早在管道中使用$match筛选出结果,以缩短处理时间。您只需稍微改写一下逻辑即可
{$match:{$expr:{
$or:[
{$和:[
{$eq:[“$id”,1206]},
{$eq:[“$field1”,0]}
]},
{$和:[
{$ne:[“$id”,1206]},
{$eq:[“$field1”,1545001200]}
]},
],
}}}
从逻辑上讲,这两种说法是等价的:
- 如果id==1206,则通过检查
匹配文档,否则通过检查field1==0
field1==1545001200
- 如果(
和id==1206
)或(field1==0
和id!=1206
)匹配文档field1==1545001200
$match
中使用这些条件?使用正常的if
else
或使用$redact
聚合执行此操作。但是我真的很赞成简单的if
else
你能告诉我如何使用if-else吗?@med.tu-我想你想做一个$project
而不是$match
。我现在几乎陷入困境。是否要筛选或$project
输出?这在4.2.5
中不起作用。抛出的错误是“未知运算符:$expr”
。同样的,在4+中不起作用,看起来我在编写示例时没有进行测试。更新以参考iamfrank的答案。