2015-08-08 5 views
2

Я хочу сортировать коллекцию, помещая элементы с определенными значениями перед другими предметами.Сортировка товара по значению mongodb

Например, я хочу, чтобы все предметы с "getthisfirst": "yes" были перед всеми остальными.

{"getthisfirst": "yes"} 
{"getthisfirst": "yes"} 
{"getthisfirst": "no"} 
{"getthisfirst": "maybe"} 

ответ

5

Это, как общая концепция называется "весовой". Таким образом, без какого-либо другого механизма на месте, вы логически обрабатываете это в запросе MongoDB путем «прогнозирования» значений для «веса» в документе логически.

Ваш метод «проектирование» и изменения полей присутствуют в вашем документе, является .aggregate() метод, а именно это этап $project трубопровода:

db.collection.aggregate([ 
    { "$project": { 
     "getthisfirst": 1, 
     "weight": { 
      "$cond": [ 
       { "$eq": [ "$getthisfirst", "yes" ] }, 
       10, 
       { "$cond": [ 
        { "$eq": [ "$getthisfirst", "maybe" ] }, 
        5, 
        0 
       ]} 
      ] 
     } 
    }}, 
    { "$sort": { "weight": -1 } } 
]); 

$cond оператор здесь является "ternary" (если/то/другое) Условие, где первый аргумент является условным статусом, прибывающим в boolean true|false. Если true «then», в качестве результата возвращается второй аргумент, иначе в ответ возвращается «else» или третий аргумент.

В этом «вложенном» случае, когда «да» является совпадением, назначается определенный «вес», иначе мы переходим к следующему критерию условия, когда «возможно» является совпадением, а затем оценка или иначе оценка равна 0, так как у нас есть только три возможности для сопоставления.

Тогда условие $sort применяется для того, чтобы «заказать» (в порядке убывания) результаты с наибольшим «весом» сверху.

Смежные вопросы