如何在Pymongo find方法中使用条件语句

问题描述 投票:0回答:1

因此,我尝试搜索数据库以查看哪些文档通过了特定测试。字典的结构是

dict = {
       'test_results':{
                        'test1':1, ## either 0 or 1 depending on failing/passing respectively 
                        'test2':0,
                        ...,
                        'testN':1
        },
       'identifier': ID 
}

所以我想进行搜索以打印未通过测试 2 的文档的所有标识符。

我尝试编写一个查询,例如

list(mycol.find({},{
    "_id":0,
    "$expr":{
        "$cond": {
            'if': {"$lt":["$test_results.test2",1]},
            'then': {"ID":"$identifier"}
        }
    }
}))

我希望这能给我测试 2 结果为 0 的文档的标识符,但这只是给了我错误

FieldPath field names may not start with '$'. Consider using $getField or $setField., full error: {'ok': 0.0, 'errmsg': "FieldPath field names may not start with '$'. Consider using $getField or $setField.", 'code': 16410, 'codeName': 'Location16410'}

我想知道我的查询做错了什么/是否有任何建议可以使我的搜索更有效。

database mongodb dictionary conditional-statements pymongo
1个回答
0
投票

find
的第二个参数是一个投影,因此它必须在顶层具有字段名称。您已经输入了
$expr
,但您可能想要
ID
。因此,要以最少的更改修复现有查询:

list(mycol.find({},{
  "_id": 0,
  "ID": {
    "$cond": {
      "if": { "$lt": ["$test_results.test2", 1] },
      "then": "$identifier",
      "else": None
    }
  }
}))

Mongo Plaground中的 JS 等效项。

但是通过该查询,您会得到

None

 对于它所通过的那些 ID;这可能没有用。请参阅第二个测试,其具有 
test2: 1
,因此结果具有 
ID: null

但是,您说

“给我测试 2 结果为 0 的文档的标识符”,所以这应该是您 find

 标准的一部分:

list(mycol.find( { "test_results.test2": 0 }, # the query # the projection { "_id": 0, "ID": "$identifier" } ))
如您所见,这是一个简单得多的查询和投影。 

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.