sql >> Database >  >> NoSQL >> MongoDB

Volgorde van resultaten in MongoDB met $in?

In het algemeen:als u zoekt zonder gespecificeerde sorteervolgorde, is er geen gegarandeerde volgorde van resultaten.

Bovendien is het niet mogelijk om op een array te sorteren (en nog minder als je een array op een array wilt sorteren zoals beschreven). Een sort() gebruikt logische vergelijking om oplopende of aflopende volgorde te bepalen op basis van een veld in uw resultaatdocumenten.

U zou elke gewenste aangepaste sorteerlogica in uw eigen applicatiecode moeten implementeren.

Een nuttige benadering zou kunnen zijn om gebruik te maken van het nieuwe Aggregation Framework in MongoDB 2.2 .. in het bijzonder de mogelijkheid om $unwind een array in een stroom documenten.

Bijvoorbeeld, testgegevens instellen als:

{ "_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 ] }

Een $in zoeken op [2,3] zou resulteren in de overeenkomende documenten:

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

Met het aggregatieraamwerk kun je $match dezelfde documenten en manipuleer vervolgens de resultaten om wat basissortering te bereiken:$unwind de arrays, $sort hen, en dan $group deze terug in een resultaat:

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

Dus in dit voorbeeld worden de documenten met overeenkomende arrays nu in oplopende volgorde gesorteerd voor de arraywaarden:

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


  1. Referenties versus insluitingen in MongoDB

  2. Spring-boot:mongoDB-datumvergelijking werkt niet

  3. Hoe verwijder ik alles in Redis?

  4. MongoServer.State-equivalent in de 2.0-driver