我需要判断find语句是否返回非空查询.

我所做的是:

query = collection.find({"string": field})
if not query: #do something

然后我意识到我的if语句从未执行过,因为find返回一个游标,无论查询是否为空.

因此,我查看了documentation,发现有两种方法可以帮助我:

  1. count(with_limit_and_skip=False)(根据描述):

    返回此查询结果集中的文档数.

    这似乎是判断的好方法,但这意味着我需要数数

  2. retrieved(根据描述):

    到目前为止检索到的文档数.

    我在一个空查询集上测试了它,它返回零,但不是

那么,判断find()查询是否返回空集的最佳方法(最佳实践)是什么?上述方法之一是否适用于此目的?那么性能呢?还有其他方法吗?


我需要明确一点:我需要知道查询是否为空,并且我希望在性能和pythonic方面找到使用游标的最佳方式.

推荐答案

EDIT: While this was true in 2014, modern versions of pymongo and MongoDB have changed this behaviour. Buyer beware:

.count()是查找查询中返回的结果数的正确方法.count()方法不会耗尽游标的迭代器,因此在迭代结果集中的项之前,可以安全地进行.count()次判断.

MongoDB 2.4中的计数方法的性能得到了极大的改进.唯一能让你的count变慢的事情就是查询是否有索引集.要确定查询中是否有索引,可以执行以下操作

query = collection.find({"string": field})
print query.explain()

如果在结果中看到BasicCursor,则需要在string字段中为该查询创建索引.


EDIT:正如@alvapan指出的,pymongo 3.7+中的pymongo deprecated this方法现在更倾向于在单独的查询中使用count_documents.

item_count = collection.count_documents({"string": field})

计算查询返回的项数的正确方法是,在迭代查询后判断查询上的.retreived计数器,或者首先判断查询:

# Using .retrieved
query = collection.find({"string": field})
for item in query:
    print(item)

print('Located {0:,} item(s)'.format(query.retrieved))

或者,换一种方式:

# Using the built-in enumerate
query = collection.find({"string": field})
for index, item in enumerate(query):
    print(item)

print('Located {0:,} item(s)'.format(index+1))

Mongodb相关问答推荐

try 从数据库创建、获取数据时失败(pymongo、MongoDB、docker-compose)

构造函数的参数 0 需要错误类型的 bean

Spring Boot 升级后未映射 Mongo 模板结果

我可以在 MongoDB 中将字段值设置为对象键吗?

如何在 MongoDB 中对字段进行自定义排序

在MongoDb的数组中计算大于某个数字的数字

NodeJS + MongoDB:使用 findOne () 从集合中获取数据

如何使用python将csv数据推送到mongodb

mongoose通过引用属性查找文档

Node.js 数据库的抽象层

使用 ObjectId.GenerateNewId() 还是离开 MongoDB 创建一个?

使用 MongoDB 更新数组字段内的特定键/值

如何在 mongoDB 中聚合巨大的数组?

如何使用 MongoDB Compass 对数据进行排序

如何在 MongoDB 的 $match 中使用聚合运算符(例如 $year 或 $dayOfMonth)?

指定在 mongodb .js 脚本中使用哪个数据库

Mongodb 设计,嵌入与关系

如何在第一个文档中恢复 MongoDB ChangeStream 而不仅仅是在我开始收听后更改

mongoose查询返回 null

Mongodb Compass 无法在 Ubuntu 18.10 中打开