Как сделать в MongoDB мультизапрос для одной коллекции?
Через что делать запросы такого рода в MongoDB (python, motor)?
Есть сборник Задач. Вывести их в один список необходимо в следующем порядке:
- Срочно в первую очередь.
- Дальнейшее невыполненное.
- Дальнейшие остатки отсортированы по дате от недавнего к самому старому. Я пробовал вот так:
vtodos = db.vtodo.find({'$or': [
{"user": user, 'next_time': {'$lt': now}}.sort(
[("completed", 1), ("is_project", -1)]),
{"user": user, 'completed': None}.sort(
[("is_project", -1)]),
{"user": user}.sort(
[("completed", -1), ("is_project", -1)]), ]})
Но оказалось, что такую сортировку внутри запроса использовать нельзя:
AttributeError: 'dict' object has no attribute 'sort'
Примеры документов:
{'_id': ObjectId('10968e7c34dc25546dbd87fb'),
'title': 'Task1',
'user': ObjectId('1077f7207610f32a8d5e7e0c')},
{'_id': ObjectId('1096988f8d23679184d619a3'),
'title': 'Task2',
'user': ObjectId('1077f7207610f32a8d5e7e0c'),
'completed': datetime.datetime(2021, 6, 4, 8, 30, 16, 631000),
'next_time': datetime.datetime(2021, 6, 5, 8, 30, 16)},
{'_id': ObjectId('10ac00d944af5d1ebae877b6'),
'title': 'Task3',
'creator': ObjectId('1077f7207610f32a8d5e7e0c'),
'is_project': True}
Обновление: пробовали без сортировки внутри, но результаты с
$or
вообще неупорядочен:
db.vtodo.find({'$or': [
{"creator": oid, 'next_time': {'$lt': now}, "project": None},
{"creator": oid, "project": None, 'completed': None},
{"creator": oid, "project": None}, ]}).sort(
[("is_project", -1)])
Итак, попробуем агрегировать, как рекомендует @turivishal