MongoDB: как получить максимум поля с помощью индекса - PullRequest
0 голосов
/ 05 февраля 2019

У меня довольно большая коллекция MongoDB (примерно 30 миллионов документов), пытающаяся получить максимум вложенного поля nested.my_time.Монго версия 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)

.. таким образом, индекс явно работает и работает.Любые идеи, как заставить монго использовать индекс для макс?

1 Ответ

0 голосов
/ 05 февраля 2019

Поскольку у вас есть индекс для nested.my_time, для сортировки и ограничения следует использовать этот индекс.Из оболочки с объяснением executeStats:

db.<coll name>.find().sort({"nested.my_time": -1}).limit(1).explain(1)

или в виде агрегации без объяснения:

db.<coll name>.aggregate([{$sort: {"nested.my_time": -1}},{$limit: 1}])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...