因此,我尝试搜索数据库以查看哪些文档通过了特定测试。字典的结构是
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'}
我想知道我的查询做错了什么/是否有任何建议可以使我的搜索更有效。
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"
}
))
如您所见,这是一个简单得多的查询和投影。