Generellt:om du söker utan angiven sorteringsordning finns det ingen garanterad ordning av resultaten.
Dessutom är det inte möjligt att sortera efter en array (ännu mindre om du vill sortera en array efter en array enligt beskrivningen). En sort() använder logisk jämförelse för att bestämma stigande eller fallande ordning baserat på ett fält i dina resultatdokument.
Du skulle behöva implementera vilken anpassad sorteringslogik som helst i din egen applikationskod.
Ett användbart tillvägagångssätt kan vara att dra nytta av det nya Aggregation Framework i MongoDB 2.2 .. i synnerhet möjligheten att $unwind en array i en ström av dokument.
Till exempel, ställa in 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ökning på [2,3] skulle resultera i matchande dokument:
> 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 aggregeringsramverket kan du $match
samma dokument och sedan manipulera resultaten för att uppnå någon grundläggande sortering:$unwind
arrayerna, $sort
dem och sedan $group
dessa tillbaka till ett resultat:
db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
Så i det här exemplet är dokumenten med matchande arrayer nu sorterade i stigande ordning för arrayvärdena:
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}