MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Reihenfolge der Ergebnisse in MongoDB mit $in?

Allgemein gilt:Wenn Sie ohne festgelegte Sortierreihenfolge suchen, gibt es keine garantierte Reihenfolge der Ergebnisse.

Außerdem ist es nicht möglich, nach einem Array zu sortieren (noch weniger, wenn Sie wie beschrieben ein Array nach einem Array sortieren möchten). Ein sort() verwendet logische Vergleiche, um die aufsteigende oder absteigende Reihenfolge basierend auf einem Feld in Ihren Ergebnisdokumenten zu bestimmen.

Sie müssten jede gewünschte benutzerdefinierte Sortierlogik in Ihren eigenen Anwendungscode implementieren.

Ein nützlicher Ansatz könnte darin bestehen, das neue Aggregation Framework zu nutzen in MongoDB 2.2 .. insbesondere die Möglichkeit, $unwind ein Array in einen Stream von Dokumenten.

Beispiel:Einrichten von Testdaten 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 ] }

Ein $in Suche nach [2,3] würde zu den passenden Dokumenten führen:

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

Mit dem Aggregationsframework könnten Sie $match dieselben Dokumente und manipulieren Sie dann die Ergebnisse, um eine grundlegende Sortierung zu erreichen:$unwind die Arrays, $sort sie und dann $group diese zurück in ein Ergebnis:

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

In diesem Beispiel werden also die Dokumente mit übereinstimmenden Arrays nun in aufsteigender Reihenfolge nach den Array-Werten sortiert:

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