Generelt:hvis du søger uden angivet sorteringsrækkefølge, er der ingen garanteret rækkefølge af resultater.
Derudover er det ikke muligt at sortere efter et array (endnu mindre, hvis du vil sortere et array efter et array som beskrevet). En sort() bruger logisk sammenligning til at bestemme stigende eller faldende rækkefølge baseret på et felt i dine resultatdokumenter.
Du skal implementere enhver ønsket tilpasset sorteringslogik i din egen applikationskode.
En nyttig tilgang kan være at drage fordel af det nye Aggregation Framework i MongoDB 2.2 .. især evnen til at $unwind et array i en strøm af dokumenter.
For eksempel opsætning af testdata som:
{ "_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 ] }
En $in
søgning på [2,3] ville resultere i de matchende dokumenter:
> 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 ] }
Med aggregeringsrammen kunne du $match
de samme dokumenter og manipuler derefter resultaterne for at opnå en vis grundlæggende sortering:$unwind
arrays, $sort
dem, og derefter $group
disse tilbage til et resultat:
db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
Så i dette eksempel er dokumenterne med matchende arrays nu sorteret i stigende rækkefølge for array-værdierne:
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}