Подтвердить что ты не робот

Монго комплексная сортировка?

Я знаю, как сортировать запросы в MongoDB по нескольким полям, например, db.coll.find().sort({a:1,b:-1}).

Могу ли я сортировать пользовательскую функцию; например, предполагая, что a и b являются целыми числами, разностью между a и b (a-b)?

Спасибо!

4b9b3361

Ответ 1

ОБНОВЛЕНИЕ: Этот ответ кажется устаревшим; кажется, что пользовательская сортировка может быть более или менее достигнута с помощью функции $project конвейера агрегации для преобразования входных документов перед сортировкой, См. Также ответ @Ari.

Я не думаю, что это возможно напрямую; сортировка документации, конечно, не упоминает о каком-либо способе предоставления пользовательской функции сравнения.

Вы, вероятно, лучше всего выполняете сортировку в клиенте, но если вы действительно настроены сделать это на сервере, вы можете использовать db.eval() для организации запуска сортировки на сервере (если ваш клиент поддерживает его).

Сортировка на стороне сервера:

db.eval(function() { 
  return db.scratch.find().toArray().sort(function(doc1, doc2) { 
    return doc1.a - doc2.a 
  }) 
});

В сравнении с эквивалентной клиентской сортировкой:

db.scratch.find().toArray().sort(function(doc1, doc2) { 
  return doc1.a - doc2.b 
});

Обратите внимание, что также можно сортировать по конвейеру и $orderby (т.е. в дополнение к .sort()), однако ни один из этих способов не позволяет вам предоставлять собственную функцию сортировки.

Ответ 2

Встаньте в это, и вот что я придумал:

db.collection.aggregate([
  { 
    $project: {
      difference: { $subtract: ["$a", "$b"] }
      // Add other keys in here as necessary
    }
  },  
  { 
    $sort: { difference: -1 } 
  }
])

Ответ 3

Почему бы не создать поле с этой операцией и отсортировать его?