我正在try 在MongoDB实例中查找具有特定字段最大值的文档.

下面是我必须这样做的当前代码:

document = collection.find().sort('experiment_id', -1).limit(1)

if document is None:
    # ...
else:
    return document['experiment_id']

我使用这种查询格式(find()后跟sort()limit(1)组合,因为这应该是interpreted by Mongo in a highly optimized way.

但是,这不起作用,因为document是游标类型,因此不能对其调用['experiment_id'].

我发现有一点令人惊讶的是,limit(1)返回的是一个游标对象,而不是单个值或None类型.

我应该如何编写一个从文档集合中找到字段'experiment_id'的最大值的pymongo查询?

很明显,以下方法将会奏效,但似乎不是一个特别好的解决方案.

for document in documents:
    return document['experiment_id']

推荐答案

因为你只想要一个结果-作为一个文档,而不是一个光标,你可以使用find_one()和一个sort条件,它的行为就像它作为一个参数到find(),并删除limit子句,因为它将被忽略.

find_one(filter=None, *args, **kwargs)

返回单个文档,如果找不到匹配的文档,则返回None.

document = collection.find_one({}, sort={'experiment_id': -1})

if document is None:
    # ...
else:
    return document['experiment_id']

此外,如果您只想要‘Experience_id’,而不想要其他的,那么您可以使用projection,它将返回一个只包含指定字段的文档.

document = collection.find_one(
    {},
    sort={'experiment_id': -1},
    projection={'_id': False, 'experiment_id': True}  # only experiment_id
)

if document:
    return document['experiment_id']
# else logic here

Mongodb相关问答推荐

使用查询参数过滤MongoDB Go驱动程序时出现问题

在MongoDB查询中添加来自另一个集合的匹配文档的计数

MongoDB 在一个聚合中包含多个组

对对象数组进行分组并在 mongodb 中获取计数

mongodb.将文档分组在数组中,对它们进行评分计数和求和并添加新字段

如何使用 MindsDB 和 MQL(对于我的 MongoDB 实例)实施零样本分类?

使用golang中的过滤器从mongodb复合集合中获取所有数据

使用 mongo-driver/mongo 使用键/值对中的值表达式查找文档

在我的查询中使用 populate() 时的 MongoDB createIndex()

从嵌套数组中 id 匹配的另一个集合中获取所有字段

node.js & express - 应用程序 struct 的全局模块和最佳实践

如何使用 mongoose 从 MongoDb 获取数据?

无法使用机器 ip 连接到 mongodb

Mongoid 有 Map/Reduce 吗?

Mongoose $push 不断添加两个条目

mongodb 模式设计命名约定

MongoError: The dollar ($) prefixed field '$push' in '$push' is not valid for storage

在 MongoDB 中快速搜索数十亿个小文档的策略

MongoDB聚合框架的索引优化

在mongoose中创建和查找地理位置