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

So sortieren Sie ein Array in einer Sammlung

Angenommen, die Artikel in Ihren products -Array einzigartig sind, gibt es keine einfache serverseitige Unterstützung, um dieses Array wie bei MongoDB 2.4 in sortierter Reihenfolge zu verwalten. Ihre beste Option angesichts der verschachtelten Arrays besteht darin, die Arrays in Ihrer Anwendungslogik entsprechend zu sortieren (d. h. beim Einfügen/Aktualisieren oder beim Abrufen/Anzeigen).

Überlegungen zur Datenmodellierung

Wenn Sie viel an verschachtelten Array-Einträgen manipulieren müssen, sollten Sie erwägen, Ihr Datenmodell zu verflachen, um die Arbeit damit zu vereinfachen. Ihr Designziel mit MongoDB sollte ein Datenmodell sein, das für Ihre Anwendungsfälle geeignet ist, mit einem akzeptablen Leistungsgleichgewicht zwischen einfachem Einfügen/Aktualisieren/Abfragen. Sie müssen definitiv nicht alles in einer einzigen Sammlung/Abfrage modellieren, wenn dies keinen Sinn macht, und Sie sollten darauf vorbereitet sein, Daten zu denormalisieren (duplizieren). Für Viele-zu-Viele-Beziehungen wie Produkte <=> Kategorien ist es typisch, die Entität einzubetten und zu denormalisieren, die weniger häufig aktualisiert wird (z. B. Einbetten von Kategorien in Produkte).

Persistente sortierte, gedeckelte Arrays (nicht eindeutige Elemente)

Wenn Sie Arrays in sortierter Reihenfolge beibehalten möchten und die Elemente sind nicht eindeutig, MongoDB 2.4 hat die Option $push zu einem sortierten Array, aber dies muss in Verbindung mit einem Slice (Array-Limit) verwendet werden. Wenn Sie $push identische Einträge in einem sortierten Array erhalten Sie Duplikate (also ist dies wahrscheinlich nicht das, wonach Sie suchen).

Beispielaktualisierung, vorausgesetzt page in Ihrem Beispiel war der Sammlungsname:

db.page.update(
    // Query
    { "_id": "56rgt46rt54h68rt4h6" },

    // Update sorted array
    // NB: referring by array index position 0, as there isn't a named reference
    { $push : {
        "categories.0.products" : { 

            // List of new elements to push
            $each : [
                { "name" : "E", "pos": 3 }
            ],

            // Sort by pos (ascending)
            $sort : { "pos" : 1 },

            // Maximum number of array elements (required for $sort)
            $slice : -100
        }
    }}
)