2015-01-18 1 views
0

У меня есть простой набор для понимать своего рода в MongoDBсортировки массива и массив Object MongoDb

мои документы:

{ 
    "_id" : ObjectId("54b94985d74d670613e4fd35"), 
    "tag" : [ 
     "A", 
     "B", 
     "Z" 
    ] 
} 

{ 
    "_id" : ObjectId("54b949c9d74d670613e4fd36"), 
    "tag" : [ 
     "D", 
     "E", 
     "F" 
    ] 
} 

{ 
    "_id" : ObjectId("54b949dfd74d670613e4fd37"), 
    "tag" : [ 
     "G", 
     "H", 
     "I" 
    ] 
} 

Когда я сортирую по меткам У меня есть эти результаты

db.candy.find().sort({tag:1}) 


{ 
    "_id" : ObjectId("54b94985d74d670613e4fd35"), 
    "tag" : [ 
     "A", 
     "B", 
     "Z" 
    ] 
} 

{ 
    "_id" : ObjectId("54b949c9d74d670613e4fd36"), 
    "tag" : [ 
     "D", 
     "E", 
     "F" 
    ] 
} 

{ 
    "_id" : ObjectId("54b949dfd74d670613e4fd37"), 
    "tag" : [ 
     "G", 
     "H", 
     "I" 
    ] 
} 

Вместо этого с тегом: -1

db.candy.find().sort({tag:-1}) 

{ 
    "_id" : ObjectId("54b94985d74d670613e4fd35"), 
    "tag" : [ 
     "A", 
     "B", 
     "Z" 
    ] 
} 

{ 
    "_id" : ObjectId("54b949dfd74d670613e4fd37"), 
    "tag" : [ 
     "G", 
     "H", 
     "I" 
    ] 
} 

{ 
    "_id" : ObjectId("54b949c9d74d670613e4fd36"), 
    "tag" : [ 
     "D", 
     "E", 
     "F" 
    ] 
} 

Результаты очень похожи, первый объект Это то же самое и меняет только второе и третье. Те же результаты с массивом объекта. Мой вопрос: Как это работает? Я знаю, что буква A является первой буквой алфавита (ASCII CODE), а Z - последней. Монго проверить каждый элемент (или объект) массива? И почему порядок внутри массива тот же, когда я использую tag: -1 и tag: 1? Я ожидаю, что-то вроде

тег: 1

{ 
    "_id" : ObjectId("54b94985d74d670613e4fd35"), 
    "tag" : [ 
     "A", 
     "B", 
     "Z" 
    ] 
} 

И тег: -1

{ 
    "_id" : ObjectId("54b94985d74d670613e4fd35"), 
    "tag" : [ 
     "Z", 
     "A", 
     "B" 
    ] 
} 

ответ

1

Просто повторно итерацию и разработать на @marcinn, ответ.

Когда выдается ниже заявление, он просит mongodb на sort документы, которые были найдены в запросе, переданного find() заявления, в данном случае, все документы в коллекции будут возвращены функцией find(), на tag раздел.

Точку отметить здесь, поле tag имеет типа array, а не простого поля.

db.candy.find().sort({tag:1}) 

Если бы это было просто поле, эти документы будут отсортированы по значению в tag поле.

В любом случае, mongodb требует значения, с помощью которого он может сортировать документы. Для получения значения поля mongodb выполняет следующие действия:

  • Проверяет, является ли tag массив. Если это массив, ему нужно выбрать элемент из массива, значение которого он может считать весом конкретного документа.
  • Теперь он проверяет, соответствует ли указанная сортировка по возрастанию или по убыванию .
  • Если он находится в порядке возрастания, он находит наименьший элемент в теге массив, еще самый большой.
  • С элементом, выбранным из массива тегов, для каждого документа применяется сортировка .

Один важный момент, чтобы отметить здесь, что операция сортировки только изменяет порядок корневых документов, полученных, другими словами, он действует как order by оговорки в SQL условиях.

Это не изменить порядок элементов массива тегов для каждого документа.

Как правило, запрос find(), с привязанными к нему операциями limit, sort, не изменяет структуру извлеченных документов. Чтобы управлять структурой документов, вам необходимо выполнить агрегированную операцию.

Что вы ожидаете в своем вопросе, достигается путем манипулирования полями в каждом документе, который может выполнять только операция агрегации.

Так что, если вы агрегировать как,

db.candy.aggregate([ 
{$match:{"_id":ObjectId("54b94985d74d670613e4fd35")}}, 
{$unwind:"$tag"}, 
{$sort:{"tag":-1}}, 
{$group:{"_id":"$_id","tag":{$push:"$tag"}}} 
]) 

тогда вы могли бы получить результат как:

{ 
    "_id" : ObjectId("54b94985d74d670613e4fd35"), 
    "tag" : [ 
     "Z", 
     "A", 
     "B" 
    ] 
} 
+0

спасибо, в этом случае http://pastebin.com/igKBxKNJ, если Я делаю: 'db.coll.find(). Sort ({" post ": 1})' или 'db.coll.find(). Sort ({" post.tag ": 1})' Я получаю тот же Результат. Что отличается от 'post' и' post.tag'? – monkeyUser

4

сортировки оператора при сортировке документов по полю массива, выполняет следующие действия:

  1. При сортировке по убыванию требуется самый большой элемент из каждого массива и сравнивается с другим

  2. При сортировке по возрастанию, она занимает наименьший элемент из каждого массива и сравнивает с другими

Они используются только для сортировки документов, так вот почему порядок внутри документа тот же

С массивами меньшая по сравнению или по возрастанию сортировка сравнивает наименьший элемент массивов , а сравнение по сравнению с убывает по сравнению с наибольшим элементом массивов. Таким образом, при сравнении поля, значение которого является одноэлементным массивом (например, [1 ]) с полями без массива (например, 2), сравнение между 1 и 2. Сравнение пустого массива (например, []) обрабатывает пустой массив как меньше нуля или отсутствует поле.

http://docs.mongodb.org/manual/reference/method/cursor.sort/

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