MongoDB/PyMongo:查询多个条件 - 意外结果
Posted
技术标签:
【中文标题】MongoDB/PyMongo:查询多个条件 - 意外结果【英文标题】:MongoDB/PyMongo: Querying multiple criteria - unexpected results 【发布时间】:2014-06-27 22:26:25 【问题描述】:我有一个集合,其中一些对象具有键 foo
。我现在尝试查询所有确实具有此键但不具有特定值bar
的对象。为此,我使用以下查询:
collection.find('foo': '$exists': True, 'foo': '$ne': 'bar')
我认为这两个标准都是通过逻辑 AND 连接的。但是,我也得到了不具有密钥 foo
的对象。事实上,当我只使用查询时,我得到了相同的结果
collection.find('foo': '$ne': 'bar')
另一方面,如果我使用
collection.find('foo': '$exists': True)
我正确地只获取带有foo
的对象,但显然是所有对象,因此其中一些具有bar
的值。
我必须如何制定我的查询以实现我的初始结果?是否有一种测试多个标准的顺序?我是否明确指定了两个条件的逻辑与?
【问题讨论】:
这是一个很好的基本 pymongo 查询示例。我希望它在我用谷歌搜索“pymongo find examples”时早点出现:-\。 +1 我认为不需要 PyMongo 的具体示例,因为语法与使用 Mongo shell 时的语法基本相同。我认为 Mongo shell 在关键字和字段名称周围加引号时更加慷慨(例如,$ne : 'bar'
应该和'$ne' : 'bar'
一样有效)。也许True
的大写也很重要。
【参考方案1】:
您可以使用$and
加入多个条件:
collection.find("$and": ["foo": '$ne': 'bar',
"foo": '$exists': True])
【讨论】:
完美,谢谢!我只是想,如果你有一个标准列表,AND
是测试它们的隐含方式。我发现的大多数示例只关注$or
,因此可能是我的误解。但是支持任意复杂条件,$and
当然是很有意义的。
一般用途的较短版本"$and": ["key1": value1, "key2": value2]
【参考方案2】:
不用$and
,也可以
db.collection.find("foo":"$ne":"bar", "$exists":true)
【讨论】:
酷,谢谢!所以我想我有这个问题,因为两个标准都引用同一个键foo
。两种解决方案的性能有什么不同吗?
使用 "$and" 将返回整个文档(假设它只返回一个结果),而没有 "$and" 的查询将只返回结果文档 id。以上是关于MongoDB/PyMongo:查询多个条件 - 意外结果的主要内容,如果未能解决你的问题,请参考以下文章