агрегация mongodb: сортировка, если условие выполнено, иначе верните документ таким, какой он есть

#mongodb #mongodb-query #aggregation-framework #pymongo

Вопрос:

Я хочу написать конвейер агрегации, в котором я хочу сортировать, выполняется ли условие. Если условие не выполнено, то я хочу просто вернуть документы в том виде, в каком они есть. Как это сделать дальше? примеры документов, в которых я проверяю поле has_presence, чтобы решить, следует ли сортировать документы по полю имени (в каждом документе всегда будет поле has_presence):

Случай 1:

 Input:
    {
    "name": "microsoft",
    "has_presence": true
    },
    {
    "name": "google",
    "has_presence": true
    }
Output:
    {
    "name": "google",
    "has_presence": true
    },
    {
    "name": "microsoft",
    "has_presence": true
    }
Explanation: has_presence is true, so sorted the output by name.
 

Случай 2:

 Input:
    {
    "name": "microsoft",
    "has_presence": false
    },
    {
    "name": "google",
    "has_presence": false
    }
Output:
    {
    "name": "microsoft",
    "has_presence": false
    },
    {
    "name": "google",
    "has_presence": false
    }
Explanation: has_presence is false, so kept the order as it is in output.
 

Комментарии:

1. в каком ты состоянии ?

2. вопрос в том, как отсортировать только одну часть коллекции? и зачем вам это нужно? по соображениям производительности? или вы просто хотите сохранить старые позиции в несортированной части? (сортировка $natural)

3. Нет, я хочу отсортировать всю коллекцию на основе поля, которое всегда будет присутствовать в документах. Добавлены пояснения к примерам для ясности. @Такис_

4. хорошо, но эти 2 коллекции всегда имеют значение true или всегда false, что должно произойти, если в 1 коллекции некоторые из них являются ложными, а некоторые-истинными? или этого никогда не может случиться?

5. да @Takis_, этого никогда не может случиться

Ответ №1:

вот мой пример : https://mongoplayground.net/p/5p7HOws9l5Q

 db.collection.aggregate([
  {
    "$project": {
      name: 1,
      has_presence: 1,
      sort: {
        "$cond": {
          "if": "$has_presence",
          "then": "$name",
          "else": "_id"
        }
      }
    }
  },
  {
    $sort: {
      sort: 1
    }
  }
])