MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Ordre des résultats dans MongoDB avec $in ?

En général :si vous effectuez une recherche sans ordre de tri spécifié, l'ordre des résultats n'est pas garanti.

De plus, il n'est pas possible de trier par un tableau (encore moins si vous voulez trier un tableau par un tableau comme décrit). Un sort() utilise une comparaison logique pour déterminer l'ordre croissant ou décroissant en fonction d'un champ dans vos documents de résultats.

Vous devrez implémenter la logique de tri personnalisée souhaitée dans votre propre code d'application.

Une approche utile pourrait être de tirer parti du nouveau Cadre d'agrégation dans MongoDB 2.2 .. en particulier, la possibilité de $unwind un tableau en un flux de documents.

Par exemple, configurer les données de test comme :

{ "_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 recherche sur [2,3] donnerait les documents correspondants :

> 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 ] }

Avec le cadre d'agrégation, vous pouvez $match les mêmes documents, puis manipulez les résultats pour obtenir un tri de base :$unwind les tableaux, $sort eux, puis $group ceux-ci dans un résultat :

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

Ainsi, dans cet exemple, les documents avec des tableaux correspondants sont maintenant triés par ordre croissant pour les valeurs du tableau :

{
    "result" : [
        {
            "_id" : ObjectId("504ac94eb50571321b2f932c"),
            "a" : [ 1, 2, 3]
        },
        {
            "_id" : ObjectId("504ac93fb50571321b2f932a"),
            "a" : [ 1, 2, 4 ]
        },
        {
            "_id" : ObjectId("504ac954b50571321b2f932d"),
            "a" : [ 3, 7, 9 ]
        }
    ],
    "ok" : 1
}