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:查询多个条件 - 意外结果的主要内容,如果未能解决你的问题,请参考以下文章

mongodb, pymongo 查询

MongoDB pymongo模块 查询

Python操作MongoDB(PyMongo模块的使用)

MongoDB pymongo模块

将 Null 项插入集合 Mongodb (Pymongo)

MongoDB Pymongo 问题