pnd*_*pnd 5 python mongodb pymongo
我正在尝试查询一个数据库集合,该集合包含具有特定字段的那些文档的进程文档.为简单起见,请想象以下一般文档架构:
{
"timestamp": ISODate("..."),
"result1": "pass",
"result2": "fail"
}
Run Code Online (Sandbox Code Playgroud)
现在,当启动进程时,将插入仅包含时间戳的新文档.当该过程达到某些阶段时,字段会随着时间的推移result1而result2增加.一些过程但没有达到阶段1或2因而没有结果字段.
我想查询数据库只检索那些有两个result1和两个的文件result2.
我知道$ exists运算符,但据我所知,这只适用于一次一个字段,即db.coll.find({"result1": {$exists: true}}).该$exists运营商不能用作顶级运营商.例如,这并不能正常工作:
db.coll.find({"$exists": {"result1": true, "result2": true}})
要检查两个结果,我需要:
db.coll.find({"result1": {"$exists": true}, "result2": {"$exists": true}})
现在,对于多个变量已经变得乏味了.
有一个更好的方法吗?(另外,我在Python中这样做,所以如果只有pymongo驱动程序的解决方案会让我开心.)
我不知道更好,但你总是可以通过以下方式使用 JavaScript 进行处理$where:
jsStr = """var doc = this;
return ['result1','result2','result3']
.every(function(key) {
return doc.hasOwnProperty(key)
});"""
coll.find({ "$where": jsStr })
Run Code Online (Sandbox Code Playgroud)
但是您必须指定一个“键”数组来检查某处。
如果您认为有很多键需要输入,那么为什么不直接“构建”查询表达式:
whitelist = [ "result1", "result2", "result3" ]
query = {}
for key in whitelist:
query[key] = { "$exists": True }
coll.find(query)
Run Code Online (Sandbox Code Playgroud)
这可以节省一些打字时间,而且由于所有 MongoDB 查询都只是数据结构,因此使用基本数据操作来构建查询是有意义的。