Сортировка элементов массива довольно сложна. Поскольку элементы массива индексируются отдельно, сортировка по полю массива фактически приведет к некоторым интересным ситуациям. Что происходит, так это то, что MongoDB будет сортировать их по минимальному или максимальному значению в массиве (в зависимости от направления сортировки). Кроме того, порядок естественен.
Это приводит к таким вещам, как:
> db.test.save({a:[1]})
> db.test.save({a:[0,2]})
> db.test.find().sort({a:1})
{ "_id" : ObjectId("4f29026f5b6b8b5fa49df1c3"), "a" : [ 0, 2 ] }
{ "_id" : ObjectId("4f2902695b6b8b5fa49df1c2"), "a" : [ 1 ] }
> db.test.find().sort({a:-1})
{ "_id" : ObjectId("4f29026f5b6b8b5fa49df1c3"), "a" : [ 0, 2 ] }
{ "_id" : ObjectId("4f2902695b6b8b5fa49df1c2"), "a" : [ 1 ] }
Другими словами. Тот же порядок для обращенных сортов. Это связано с тем, что поле «a» верхнего документа содержит как самое низкое, так и самое высокое значение.
Таким образом, для сортировки MongoDB игнорирует все значения в массиве, которые не являются ни самыми высокими (сортировка {field: -1}), ни самыми низкими (сортировка {field: 1}), и упорядочивает оставшиеся значения.
Чтобы нарисовать (упрощенно) картинку, она работает примерно так:
сплющенное b-дерево для индекса {a: 1}, приведенного выше для примеров документов:
"a" value 0 -> document 4f29026f5b6b8b5fa49df1c3
"a" value 1 -> document 4f2902695b6b8b5fa49df1c2
"a" value 2 -> document 4f29026f5b6b8b5fa49df1c3
Как видно, сканирование сверху вниз и снизу вверх приведет к тому же порядку.
Пустые массивы являются «самым низким» из возможных значений массива и, следовательно, будут отображаться в верхней и нижней части вышеупомянутых запросов соответственно.
Индексы не изменяют поведение сортировки массивов.