#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
}
}
])