sql >> Databasteknik >  >> NoSQL >> MongoDB

Resultatordning i MongoDB med $in?

Generellt:om du söker utan angiven sorteringsordning finns det ingen garanterad ordning av resultaten.

Dessutom är det inte möjligt att sortera efter en array (ännu mindre om du vill sortera en array efter en array enligt beskrivningen). En sort() använder logisk jämförelse för att bestämma stigande eller fallande ordning baserat på ett fält i dina resultatdokument.

Du skulle behöva implementera vilken anpassad sorteringslogik som helst i din egen applikationskod.

Ett användbart tillvägagångssätt kan vara att dra nytta av det nya Aggregation Framework i MongoDB 2.2 .. i synnerhet möjligheten att $unwind en array i en ström av dokument.

Till exempel, ställa in testdata som:

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

En $in sökning på [2,3] skulle resultera i matchande dokument:

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

Med aggregeringsramverket kan du $match samma dokument och sedan manipulera resultaten för att uppnå någon grundläggande sortering:$unwind arrayerna, $sort dem och sedan $group dessa tillbaka till ett resultat:

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

Så i det här exemplet är dokumenten med matchande arrayer nu sorterade i stigande ordning för arrayvärdena:

{
    "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. Startar mongod fork, FEL:underordnad process misslyckades, avslutades med fel nummer 1

  2. BsonSerializationException vid serialisering av en Dictionary<DateTime,T> till BSON

  3. Hur man uppnår en skrivskyddad anslutning med pymongo

  4. Vilka är begränsningarna för partiella index?