Frage

Ich bilde es mir ein foo aktualisiert gerade den dritten Kommentar, comments.2.value, während Bar Ist $pull-ing, wodurch der erste Kommentar entfernt wird.

Wenn foo wird zuerst beendet, dann wird der dritte Kommentar erfolgreich aktualisiert, da der Index immer noch korrekt ist.

Aber falls Bar wird zuerst beendet, dann hat sich der Index geändert, und foo'S comments.2.value würde den dritten Kommentar nicht mehr beeinflussen.

Ist dieses Szenario möglich, und wenn ja, frage ich mich, ob es gemeinsame Lösungen für Array-Element-Updates und Rennbedingungen gibt?

Danke !

War es hilfreich?

Lösung

Die von Ihnen beschriebene Situation ist theoretisch möglich, wenn mehrere Anwendungen gleichzeitig auf die Datenbank zugreifen.Aus diesem Grund ist es am besten, wenn möglich, jedem Mitglied des Arrays eine eindeutige Kennung zu geben, anstatt auf Elemente im Array nach Position zuzugreifen.

Zum Beispiel,

> db.myComments.save({_id:1,
comments:[
{cid:1, author:"Marc", comment:"Marc's Comment"}, 
{cid:2, author:"Mike", comment:"Mike's Comment"}, 
{cid:3, author:"Barrie", comment:"Barrie's Comment"}
]})

Wenn wir Mikes Kommentar ändern möchten, aber nicht unbedingt wissen, dass er an zweiter Stelle im Array erscheint, können wir ihn wie folgt aktualisieren:

> db.myComments.update({_id:1, "comments.cid":2}, {$set:{"comments.$.comment":"Mike's NEW Comment"}})
> db.myComments.find().pretty()
{
    "_id" : 1,
    "comments" : [
        {
            "cid" : 1,
            "author" : "Marc",
            "comment" : "Marc's Comment"
        },
        {
            "author" : "Mike",
            "cid" : 2,
            "comment" : "Mike's NEW Comment"
        },
        {
            "cid" : 3,
            "author" : "Barrie",
            "comment" : "Barrie's Comment"
        }
    ]
}

Wir könnten sogar das gesamte Unterdokument ändern, etwa so:

> db.myComments.update({_id:1, "comments.cid":2}, {$set:{"comments.$":{cid:4, author:"someone else", comment:"A completely new comment!"}}})
> db.myComments.find().pretty()
{
    "_id" : 1,
    "comments" : [
        {
            "cid" : 1,
            "author" : "Marc",
            "comment" : "Marc's Comment"
        },
        {
            "cid" : 4,
            "author" : "someone else",
            "comment" : "A completely new comment!"
        },
        {
            "cid" : 3,
            "author" : "Barrie",
            "comment" : "Barrie's Comment"
        }
    ]
}

Das Abfragedokument findet den ersten passenden Wert im Array, und das „$“ im Aktualisierungsdokument verweist auf diese Position.

Weitere Informationen zum „$“-Operator finden Sie im Abschnitt „Der $-Positionsoperator“ der Dokumentation „Aktualisierung“.http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

Hoffentlich gibt Ihnen dies eine Vorstellung davon, wie Ihre Anwendung Werte in einem Array ändern kann, ohne auf deren Position zu verweisen.Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top