Ogólnie:jeśli szukasz bez określonej kolejności sortowania, nie ma gwarantowanej kolejności wyników.
Dodatkowo nie jest możliwe sortowanie według tablicy (a tym bardziej, jeśli chcesz posortować tablicę według tablicy, jak opisano). sortuj() używa logicznego porównania w celu określenia kolejności rosnącej lub malejącej na podstawie pola w dokumentach wynikowych.
Będziesz musiał zaimplementować dowolną pożądaną niestandardową logikę sortowania we własnym kodzie aplikacji.
Przydatnym podejściem może być skorzystanie z nowej Struktury agregacji w MongoDB 2.2 .. w szczególności możliwość $unwind tablicę w strumień dokumentów.
Na przykład konfigurowanie danych testowych jako:
{ "_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
wyszukiwanie w [2,3] spowoduje wyświetlenie pasujących dokumentów:
> 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 ] }
Dzięki frameworkowi agregacji możesz $match
te same dokumenty, a następnie manipuluj wynikami, aby uzyskać podstawowe sortowanie:$unwind
tablice, $sort
je, a następnie $group
te z powrotem do wyniku:
db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
W tym przykładzie dokumenty z pasującymi tablicami są teraz posortowane w porządku rosnącym dla wartości tablicy:
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}