我有一个很大的MongoDB集合(大约3000万个文档),试图获得最大的嵌套字段nested.my_time
。 Mongo版本是3.6.6。我已经在该字段上创建了一个索引:
{
'my_index': {
'sparse': True,
'v': 2,
'background': True,
'key': [('nested.my_time', -1)],
'ns': 'my_db.my_table'
}
pymongo中的连接:
import pymongo
mclient = pymongo.MongoClient('mongodb://myuri...')
db = mclient['my_db']
my_table = db['my_table']
我尝试过的查询:
latest1 = my_table.find_one(
sort=[('nested.my_time', pymongo.DESCENDING)],
projection=['nested.my_time']
).hint('my_index')
..进行全面扫描,花费的时间太长。
latest2 = my_table.aggregate([{
'$sort': {
'nested.my_time': pymongo.DESCENDING,
}},{
'$limit': 1
}]).hint('my_index')
..也进行全扫描
latest3 = my_table.aggregate([{
'$group': {
'_id': None,
'latest': {
'$max': '$nested.my_time'
}
}
}]).hint('my_index')
..也进行全面扫描。
当我尝试仅使用给定的my_time
获取文档时,它可以正常工作,并且使用的是索引:
foo = my_table.find(
filter={'nested.my_time': datetime(2019, 2, 4, 6, 57, 4, 534000)}
).limit(1)
..所以索引很明显在这里并且可以正常工作。 任何想法如何使mongo使用max索引?
答案 0 :(得分:1)
当您在nested.my_time上有一个索引时,排序和限制应利用此索引。从shell解释executionStats:
db.<coll name>.find().sort({"nested.my_time": -1}).limit(1).explain(1)
或不进行解释的汇总:
db.<coll name>.aggregate([{$sort: {"nested.my_time": -1}},{$limit: 1}])