Как сделать в MongoDB мультизапрос для одной коллекции?

Через что делать запросы такого рода в MongoDB (python, motor)?

Есть сборник Задач. Вывести их в один список необходимо в следующем порядке:

  1. Срочно в первую очередь.
  2. Дальнейшее невыполненное.
  3. Дальнейшие остатки отсортированы по дате от недавнего к самому старому. Я пробовал вот так:
      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

0 ответов

Другие вопросы по тегам