sql >> Base de Datos >  >> NoSQL >> MongoDB

Orden de resultados en MongoDB con $in?

En general:si está buscando sin especificar un orden de clasificación, no se garantiza el orden de los resultados.

Además, no es posible ordenar por una matriz (aún menos si desea ordenar una matriz por una matriz como se describe). Un sort() utiliza la comparación lógica para determinar el orden ascendente o descendente en función de un campo dentro de sus documentos de resultados.

Tendría que implementar cualquier lógica de clasificación personalizada deseada en su propio código de aplicación.

Un enfoque útil podría ser aprovechar el nuevo marco de agregación en MongoDB 2.2... en particular, la capacidad de $unwind una matriz en un flujo de documentos.

Por ejemplo, configurar datos de prueba 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 ] }

Un $in la búsqueda en [2,3] daría como resultado los documentos coincidentes:

> 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 el marco de agregación podrías $match los mismos documentos y luego manipular los resultados para lograr una ordenación básica:$unwind las matrices, $sort ellos, y luego $group estos de nuevo en un resultado:

db.matches.aggregate(
  { $match : {
       a: { $in: [2,3] }
  }},
  { $unwind : "$a" },
  { $sort: {
      "a": -1
  }},
  { $group : {
      _id: '$_id',
      a: { $addToSet: "$a" }
  }}
)

Entonces, en este ejemplo, los documentos con matrices coincidentes ahora se ordenan en orden ascendente para los valores de la 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
}