Монго сложная сортировка? - PullRequest
33 голосов
/ 09 июля 2010

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

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

Спасибо!

Ответы [ 3 ]

30 голосов
/ 09 июля 2010

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

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

Вероятно, вам лучше всего выполнить сортировку на клиенте, но если вы действительно решили сделать это на сервере, вы можете использовать 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()), однако ни один из этих способов не позволяет вам предоставить пользовательская функция сортировки либо.

16 голосов
/ 22 октября 2014

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

db.collection.aggregate([
  { 
    $project: {
      difference: { $subtract: ["$a", "$b"] }
      // Add other keys in here as necessary
    }
  },  
  { 
    $sort: { difference: -1 } 
  }
])
11 голосов
/ 09 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...