MongoDB:如何使用索引

时间:2019-02-05 09:48:21

标签: mongodb indexing aggregation-framework

我有一个很大的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索引?

1 个答案:

答案 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}])