Em geral:se você estiver pesquisando sem nenhuma ordem de classificação especificada, não há garantia de ordenação dos resultados.
Além disso, não é possível classificar por uma matriz (ainda menos se você quiser classificar uma matriz por uma matriz conforme descrito). Um sort() usa a comparação lógica para determinar a ordem crescente ou decrescente com base em um campo nos documentos de resultados.
Você teria que implementar qualquer lógica de classificação personalizada desejada em seu próprio código de aplicativo.
Uma abordagem útil pode ser aproveitar a nova Estrutura de Agregação no MongoDB 2.2 .. em particular, a capacidade de $unwind uma matriz em um fluxo de documentos.
Por exemplo, configurando dados de teste como:
{ "_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 ] }
Um
$in
pesquisa em [2,3] resultaria nos documentos correspondentes:> 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 ] }
Com a estrutura de agregação, você pode
$match
os mesmos documentos e, em seguida, manipular os resultados para obter alguma classificação básica:$unwind
as matrizes, $sort
eles, e então $group
estes de volta em um resultado:db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
Portanto, neste exemplo, os documentos com matrizes correspondentes agora são classificados em ordem crescente para os valores da matriz:
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}