2013-05-29 5 views
2

Я хочу сортировать по коллекции MongoDB на каком-то ключевом слове в порядке возрастания и нуждаться в записях, которые не имеют ключа для последнего. напримерИндивидуальная сортировка в MongoDB

db.coll.find({}, {key: 1}).sort({key: 1}) 

дает:

{_id: 1} 
{_id: 2, key: 1} 
{_id: 3, key: 2} 

но должны дать следующие вместо:

{_id: 2, key: 1} 
{_id: 3, key: 2} 
{_id: 1} 

Есть ли способ сделать это с MongoDB?

ответ

3

К сожалению MongoDB "при сравнении значений различных типов BSON, MongoDB использует следующий порядок сравнения, от самого низкого до самого высокого:" DOCS

  1. MinKey (внутренний тип)
  2. Null
  3. Числа (Интс , тоскует, удваивается)
  4. Символ, String
  5. Объект
  6. Массив
  7. BinData
  8. ObjectID
  9. Boolean
  10. Дата, Отметка
  11. Regular Expression
  12. MaxKey (внутренний тип)

Когда Монго генерирует индекс будет включать в себя нуль для этих документов который не получил ключа. Вы можете сделать это с двумя запросами, используя запасной индекс для первого.

Если вы укажете запасной индекс в поле ключа, сортировка вернет только те, которые имеют значение. Это исключает документы, для которых нет ключа. DOCS

3

Это невозможно. При создании документов вам нужно будет установить «ключ» до теоретически максимального значения. В качестве альтернативы вы можете выполнить два запроса (один, чтобы получить все, где «ключ» существует отсортированный, и необязательный другой без «ключа», установленного вообще, чтобы дополнить ваш набор результатов, если это необходимо). Обычно последнее невозможно из-за различных ограничений бизнес-правил.

+0

+1 Несмотря на то, что я не осмеливаюсь сказать, что «невозможно», я не вижу разумного/эффективного способа сделать это. –

+1

Это невозможно с помощью одного собственного запроса. Это, конечно, возможно, если у вас нет других требований, кроме правильного результата, такого как два решения для запросов, о которых я говорил. Это говорит, что в большинстве сред, не способных быстро сделать это, фактически то же самое, что и вообще невозможно. –

1

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

Было бы более эффективно делать это в двух регулярных запросах, используя $exist.

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