Obecně:pokud vyhledáváte bez zadaného pořadí řazení, není zaručeno řazení výsledků.
Navíc není možné třídit podle pole (o to méně, pokud chcete třídit pole podle pole, jak je popsáno). A sort() používá logické porovnání k určení vzestupného nebo sestupného pořadí na základě pole ve vašich výsledných dokumentech.
Museli byste implementovat jakoukoli požadovanou vlastní logiku třídění ve svém vlastním kódu aplikace.
Užitečným přístupem může být využití nového rámce agregace v MongoDB 2.2 .. zejména schopnost $unwind pole do proudu dokumentů.
Například nastavení testovacích dat 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
hledání na [2,3] by vedlo k odpovídajícím dokumentům:
> 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 ] }
S agregačním rámcem můžete $match
stejné dokumenty a poté manipulujte s výsledky, abyste dosáhli základního třídění:$unwind
pole, $sort
a poté $group
tyto zpět do výsledku:
db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
V tomto příkladu jsou tedy dokumenty s odpovídajícími poli nyní seřazeny ve vzestupném pořadí podle hodnot pole:
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}