У меня есть поле в mongodb под названием propertyRating, значения которого: 5.0/4.0/3.0/SC.
Я хочу отсортировать данные на основе свойстваRating, сначала 5 звезд, затем 4 звезды, 3 звезды и в последнем СЦ.
Есть ли возможность отсортировать данные по 5,4,3 и потом СК.
Я использовал,
Array
(
[0] => Array
(
[$match] => Array
(
[total_charges] => Array
(
[$gt] => 0
)
)
)
[1] => Array
(
[$sort] => Array
(
[propertyRating] => -1
)
)
[2] => Array
(
[$skip] => 0
)
[3] => Array
(
[$limit] => 20
)
)
Сначала сортируются данные значений SC, а затем данные звезд 5,4,3.
Привет @ray Спасибо за ответ.
Как предложил Рэй: «Вам нужно сопоставить строки с некоторыми значениями меньше 3». Поэтому создайте поле для сортировки и установите подходящее значение, например -1.0
, когда значение равно «SC».
Вот конвейер агрегации для этого:
db.collection.aggregate([
{
// set `propertyRatingSort` to -1.0 when it's "SC"
// otherwise use the value as-is
$set: {
propertyRatingSort: {
$cond: [
{ $eq: ["$propertyRating", "SC"] },
-1.0,
"$propertyRating"
]
}
}
},
// sort descending using the created sort field
{ $sort: { propertyRatingSort: -1 } },
// remove the extra field
{ $unset: "propertyRatingSort" }
])
Поместите свой этап $match total_charges > 0
перед первым $set
выше.
Привет @aneroid Большое спасибо за подробное объяснение. Я применил логику, и она сработала.
Это ожидаемое поведение. Строки имеют больший порядок сортировки, чем числа, поэтому они всегда больше чисел. Вам нужно сопоставить строки с некоторыми значениями меньше 3, чтобы достичь ожидаемого порядка сортировки,