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

MongoDb-Aktualisierungsobjekt in einem Array beim ersten Auftreten vom letzten

Ich verstehe, was Sie sagen, dass Sie in diesem Fall das letzte Element abgleichen oder den Abgleich tatsächlich in umgekehrter Reihenfolge verarbeiten möchten. Es gibt keine Möglichkeit, dies und den im positionsbezogenen $ Operator ist immer die "erste" Übereinstimmung.

Aber Sie können Ihren Ansatz ändern, da das Standardverhalten von $push ist, an das Ende des Arrays "anzuhängen". Aber MongoDB 2.6 hat eine $position Modifikator, sodass Sie dem Array tatsächlich immer "voranstellen" können, was bedeutet, dass Ihr "ältestes" Element am Ende steht.

Nehmen Sie zum Beispiel Folgendes:

db.artest.update(
   { "array": { "$in": [5] } },
   { "$push": { "array": { "$each": [5], "$position": 0 } }},
   { "upsert": true }
)

db.artest.update(
    { "array": { "$in": [5] } },
    { "$push": { "array": { "$each": [6], "$position": 0 } }},
    { "upsert": true }
)

Das Ergebnis ist ein Dokument, das die "Umkehrung" des normalen $push ist Verhalten:

{ "_id" : ObjectId("53eaf4517d0dc314962c93f4"), "array" : [ 6, 5 ] }

Alternativ können Sie den $sort Modifikator beim Aktualisieren Ihrer Dokumente, um die Elemente so zu "ordnen", dass sie umgekehrt wurden. Dies ist jedoch möglicherweise nicht die beste Option, wenn doppelte Werte gespeichert sind.

Sehen Sie sich also an, Ihre Arrays "umgekehrt" zu speichern, wenn Sie beabsichtigen, die "neuesten" Elemente "zuerst" abzugleichen. Derzeit ist dies Ihre einzige Möglichkeit, Ihr „Match from last“-Verhalten zu erhalten.