Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在mongoDB聚合中使用$match中的$cond_Python_Mongodb_Aggregation Framework - Fatal编程技术网

Python 在mongoDB聚合中使用$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中的$cond,如下所示:

{ "$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的答案。