In generale:se stai cercando senza un ordinamento specificato, non è garantito l'ordinamento dei risultati.
Inoltre, non è possibile ordinare in base a un array (ancora meno se si desidera ordinare un array in base a un array come descritto). A sort() utilizza il confronto logico per determinare l'ordine crescente o decrescente in base a un campo all'interno dei documenti dei risultati.
Dovresti implementare qualsiasi logica di ordinamento personalizzata desiderata nel codice dell'applicazione.
Un approccio utile potrebbe essere quello di sfruttare il nuovo Aggregation Framework in MongoDB 2.2 .. in particolare, la possibilità di $unwind un array in un flusso di documenti.
Ad esempio, impostando i dati del test come:
{ "_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 ] }
Un $in
la ricerca su [2,3] risulterebbe nei documenti corrispondenti:
> 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 ] }
Con il framework di aggregazione potresti $match
gli stessi documenti e quindi manipolare i risultati per ottenere un ordinamento di base:$unwind
gli array, $sort
loro, e poi $group
questi tornano in un risultato:
db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
Quindi, in questo esempio, i documenti con gli array corrispondenti sono ora ordinati in ordine crescente per i valori dell'array:
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}