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

时间:2015-06-30 11:23:44

标签: python mongodb pymongo

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

{
    "timestamp": ISODate("..."),
    "result1": "pass",
    "result2": "fail"
}

现在,当启动进程时,将插入仅包含时间戳的新文档。当该流程达到特定阶段时,会随着时间的推移添加字段result1result2。但有些流程未达到12阶段,因此没有结果字段。

我想查询数据库以仅检索那些同时包含result1result2的文档。

我知道$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驱动程序的解决方案会让我开心。)

2 个答案:

答案 0 :(得分:2)

我不太了解,但您始终可以通过$where处理JavaScript:

jsStr = """var doc = this;
           return ['result1','result2','result3']
           .every(function(key) { 
               return doc.hasOwnProperty(key) 
           });"""

coll.find({ "$where": jsStr })

但是你必须指定一组"键"检查一下。

如果你认为你有很多要键入的键,那么为什么不只是" build"你的查询表达式:

whitelist = [ "result1", "result2", "result3" ]
query = {}

for key in whitelist:
    query[key] = { "$exists": True }

coll.find(query)

这节省了一些输入,因为所有MongoDB查询都只是数据结构,所以使用基本数据操作来构建查询是有道理的。

答案 1 :(得分:1)

如何使用$and

db.coll.find({"$and": [                                                                     
            { "fld1": { "$exists": true }}                                              
            , { "fld2": { "$exists": true }}                                            
            , { "fld3": { "$exists": true }}                                            
]})