2014-03-24 1 views
3

В Mysql Я часто использую функцию FIELD() в пункте ORDER BY:Как ORDER BY FIELD СТОИМОСТИ в MongoDB

ORDER BY FIElD(id, '1', '6', '3', ...);

Как же можно получить те же результаты в MongoDB? Я попытался следующие:

.find(...).sort({id: [1, 6, 3]})

Это не работает

+0

Возможный дубликат [Монго: как отсортировать по внешнему весу) (http://stackoverflow.com/questions/22192098/mongo-how-to-sort-by-external-weight) –

+0

И я говорю это потому, что там является способом применения оператора '$ cond' к этим« значениям »для применения этой« взвешивающей »функции. –

+1

Вы можете сделать это с помощью структуры агрегации, как показано ниже, однако он не будет использовать индекс, в отличие от SQL, так как это будет не только обрезаться с точки зрения использования ОЗУ, но также вы обнаружите, что он будет экспоненциально медленнее, когда вы вставляете больше. – Sammaye

ответ

2

Таким образом, для записи:

Учитывая массив [1,6,3] то, что вы хотите в вашем запросе заключается в следующем:

db.collection.aggregate([ 
    { "$project": { 
     "weight": { "$cond": [ 
      { "$eq": ["_id": 1] }, 
      3, 
      { "$cond": [ 
       { "$eq": ["_id": 6] }, 
       2, 
       { "$cond": [ 
        { "$eq": ["_id": 3] }, 
        1, 
        0 
       ]}, 
      ]}, 
     ]} 
    }}, 
    { "$sort": { "weight": -1 } } 
]) 

И это дает вам конкретные «веса» по порядку вашего «массива» входных данных для «проектных» весов по результатам.

+0

Это выглядит намного сложнее, чем я ожидал. Спасибо за ответ. Кстати, вы голосовали, чтобы закрыть вопрос, уверены ли вы, что это единственно возможное решение, и будет до конца дней, lol? –

+0

@SaifBechan Я * довольно * уверен, что есть ** только один ** способ предоставить внешний «вес» здесь, как демонстрирует ваш «специфичный для платформы» SQL. Так что ** да ** Я * почти уверен ** Я говорю с некоторыми авторитетами здесь после этого в течение более 26 лет моей жизни. –