Като цяло:ако търсите без указан ред на сортиране, няма гарантирано подреждане на резултатите.
Освен това не е възможно да сортирате по масив (още по-малко, ако искате да сортирате масив по масив, както е описано). sort() използва логическо сравнение, за да определи възходящ или низходящ ред въз основа на поле във вашите документи с резултати.
Ще трябва да приложите всяка желана персонализирана логика за сортиране в собствения си код на приложение.
Полезен подход може да бъде да се възползвате от новата Aggregation Framework в MongoDB 2.2 .. по-специално възможността за $unwind масив в поток от документи.
Например настройка на тестови данни като:
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac946b50571321b2f932b"), "a" : [ 5, 4, 9 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }
$in
търсенето на [2,3] ще доведе до съответстващите документи:
> db.matches.find({'a': { $in: [2,3]}})
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }
С рамката за агрегиране можете да $match
същите документи и след това манипулирайте резултатите, за да постигнете някакво основно сортиране:$unwind
масивите, $sort
тях и след това $group
тези обратно в резултат:
db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
Така че в този пример документите със съвпадащи масиви вече са сортирани във възходящ ред за стойностите на масива:
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}