MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Ordem dos resultados no MongoDB com $in?


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
}