我正在尝试查询包含具有特定字段的文档的进程文档的数据库集合。为简单起见,请想象以下一般文档架构:
{
"timestamp": ISODate("..."),
"result1": "pass",
"result2": "fail"
}
现在,当启动进程时,将插入仅包含时间戳的新文档。当该流程达到特定阶段时,会随着时间的推移添加字段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驱动程序的解决方案会让我开心。)
答案 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 }}
]})