检查MongoDB文档中是否存在多个字段

pnd*_*pnd 5 python mongodb pymongo

我正在尝试查询一个数据库集合,该集合包含具有特定字段的那些文档的进程文档.为简单起见,请想象以下一般文档架构:

{
    "timestamp": ISODate("..."),
    "result1": "pass",
    "result2": "fail"
}
Run Code Online (Sandbox Code Playgroud)

现在,当启动进程时,将插入仅包含时间戳的新文档.当该过程达到某些阶段时,字段会随着时间的推移result1result2增加.一些过程但没有达到阶段12因而没有结果字段.

我想查询数据库只检索那些有两个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驱动程序的解决方案会让我开心.)

Bla*_*ven 2

我不知道更好,但你总是可以通过以下方式使用 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 查询都只是数据结构,因此使用基本数据操作来构建查询是有意义的。