MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Ordine dei risultati in MongoDB con $in?

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
}