Задать вопрос
adelkhalitov
@adelkhalitov
>

Как отсортировать объекты в монго?

Есть какая то рандомная коллекция, примера:
[
   {_id: ..., ratingPosition: 1},
   {_id: ..., ratingPosition: 2},
   {_id: ... }, <== Без параметра ratingPosition
]


Мне нужно выводить все документы, но изначально ratingPosition от меньшего к большему (1, 2, 3...) и только после отсутсвующие поля ratingPosition.

Делая сортировку {ratingPosition: -1} позиции сортируются от большего к меньшему, после элементы без значений.
{ratingPosition: 1} изначально элементы без значений, а после от меньшего к меньшему.

Вот подобный вопрос и возможные решения.

В голове есть решения, но они слишком сложные для такой задачи:
db.getCollection("goodsTreeNodes").aggregate(
    [
        { 
            "$facet" : { 
                "outputField1" : [
                    { 
                        "$match" : { 
                            "ratingPosition" : { 
                                "$exists" : true
                            }
                        }
                    }, 
                    { 
                        "$sort" : { 
                            "ratingPosition" : 1.0
                        }
                    }
                ], 
                "outputField2" : [
                    { 
                        "$match" : { 
                            "ratingPosition" : { 
                                "$exists" : false
                            }
                        }
                    }, 
                    { 
                        "$sort" : { 
                            "name" : 1.0
                        }
                    }
                ]
            }
        }, 
        { 
            "$project" : { 
                "result" : { 
                    "$concatArrays" : [
                        "$outputField1", 
                        "$outputField2"
                    ]
                }
            }
        }, 
        { 
            "$unwind" : { 
                "path" : "$result", 
                "includeArrayIndex" : "arrayIndex", 
                "preserveNullAndEmptyArrays" : false
            }
        }, 
        { 
            "$replaceRoot" : { 
                "newRoot" : "$result"
            }
        }
    ], 
    { 
        "allowDiskUse" : false
    }
);

Посоветуйте что нибудь попроще. Спасибо
  • Вопрос задан
  • 163 просмотра
Подписаться 2 Простой Комментировать
Решения вопроса 2
zoonman
@zoonman
⋆⋆⋆⋆⋆
Вам нужно проверять на наличие значений.
https://docs.mongodb.com/manual/reference/operator...
Выполнить 2 запроса и объединить результаты, но идея не очень.

Как альтернатива - использовать агрегирование и заполнять пустые поля нулем, а затем сортировать.

В целом, что-то не так с логикой приложения. Самое наличие проблемы подобной сортировки намекает на проблему в другом месте.
Ответ написан
mindtester
@mindtester
http://iczin.su/hexagram_48
Пригласить эксперта
Ваш ответ на вопрос

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

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