sortarage
@sortarage
Я тучка-тучка-тучка, я вовсе не медведь

Как правильно работать с выборкой из Mongodb во избежание лишних обращений к базе?

Доброе утро.

Ситуация: я получаю из Mongodb ряд записей по нужным мне параметрам, например:

tasks_query = task_base.find({
    "$and": [{
        "order_id": x
    }, {
        "site": y
    }, {
        "category": z
    }]
})

Затем мне нужно несколько тысяч раз циклками пройтись по этим данным в цикле, делая выборку из Cursor по определенному параметру, образно:

for task in task_query:
    if task['order_id'] = 234:
        return task['category']


Суть: я не хочу делать несколько тысяч обращений в базу, а хочу получить одну большую выборку в память, а потом уже делать итерации по ней. Но:
  • Если я превращу выборку из базы в список словарей, мне придется каждый раз проверять всю выборку for циклами, чтобы найти нужное, что очень долго и ресурсоемко
  • При превращении в словарь будет +- то же самое, ибо индексы в разных выборках разные.

Вопрос: если я просто сохраню полученный Mongo Cursor в переменную, то смогу ли я делать выборку из него через find() как из обычной базы, без необходимости каждый раз обращаться в базу?

Если есть какое-то другое решение (например, другая струткура данных, поддерживающая индексы) или я упустил что-то важное, буду благодарен за любой совет :)
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
p00h
@p00h
Фехтовальщик-стропальщик
Монго невероятно быстра на чтение. Пусть именно она занимается поиском и сортировкой, а не python; именно для этого она и предназначена. Не бойтесь грузить ее запросами.
В конце концов сделайте очень простой тест. Потратьте время и опишите необходимый функционал в обоих вариантах: монга и питон. Измерьте время работы. И все встанет на свои места.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lega
Затем мне нужно несколько тысяч раз циклками пройтись...
Нет смысла, т.к. в результате будет только один order_id.

При превращении в словарь будет +- то же самое
Один словарь - один индекс, если нужно несколько индексов - делайте несколько словарей. Это самое быстрое - O(1), если все в память влазит. Для этого и монга особа не нужна.

Но я не думаю что у вас это критично по скорости, поэтому лучше не парится и испльзовать монгу как есть, она достаточно быстра.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы