【问题标题】:Check for existence of multiple fields in MongoDB document检查 MongoDB 文档中是否存在多个字段
【发布时间】:2015-06-30 11:23:43
【问题描述】:

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

{
    "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 驱动程序的解决方案,我已经很高兴了。)

【问题讨论】:

标签: python mongodb pymongo


【解决方案1】:

$and怎么样:

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

【讨论】:

  • 这种fields + "exists":true 的重复列表是我想要避免的,在查询中添加$and 并没有使它变得更好,只是更加复杂。请参阅 Blakes Seven 的回答,了解如何使用简单的 for 循环自动构建查询。
  • 非常正确!只是在使用 CLI 示例的原始帖子中保持风格。 MongoDB 查询的编程构造是要走的路。最好将 $and 运算符作为代码逻辑的一部分来通用处理各种查询表达式。
【解决方案2】:

我不知道更好,但您始终可以通过 $where 使用 JavaScript 进行处理:

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

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

但是你将不得不指定一个“键”数组来检查某个地方。

如果您认为要输入很多键,那么为什么不直接“构建”您的查询表达式:

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

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

coll.find(query)

这样可以节省一些输入,而且由于所有 MongoDB 查询无论如何都只是数据结构,因此使用基本数据操作来构建查询是有意义的。

【讨论】:

  • 谢谢。这很好用,这正是我在此期间最终做的事情。在你的 for 循环中,我认为你想要: query[key] = ...
猜你喜欢
  • 2018-08-16
  • 2019-03-04
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多