Domanda

Immagino foo sta facendo aggiornamento sul terzo commento, comments.2.value, mentre bar è $pull-ing, rimuovendo il primo commento.

Se foo finisce per primo, quindi il terzo commento viene aggiornato correttamente, poiché l'indice è ancora corretto.

Ma se bar finisce per primo, l'indice è cambiato, e FOO comments.2.valueTagCode non influenzerebbe più il terzo commento.

È possibile questo scenario, e se lo è, mi chiedo se ci siano soluzioni comuni per gli aggiornamenti degli elementi di array e le condizioni di corse?

Grazie!

È stato utile?

Soluzione

La situazione che hai descritto è teoricamente possibile se più applicazioni stanno accedendo al database contemporaneamente. Per questo motivo, è meglio, se possibile, dare a ciascun membro dell'array un identificativo univoco, piuttosto che accedere agli elementi nell'array per posizione.

Ad esempio,

> 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"}
]})
.

Se vogliamo modificare il commento di Mike, ma non sappiamo necessariamente che apparirà secondo nell'array, possiamo aggiornarlo come:

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

Potremmo persino cambiare l'intero sottococumento, come:

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

Il documento della query troverà il primo valore nell'array che corrisponde e il "$" nel documento di aggiornamento riferisce quella posizione.

Ulteriori informazioni sull'operatore "$" possono essere trovate nella sezione "The $ Positional Operator" della documentazione "Aggiornamento". http://www.mongodb.org/display/docs/updating#updating -The% 24positoricaloperator

Speriamo che questo ti darà un'idea di come la tua applicazione può modificare i valori in un array senza fare riferimento alla loro posizione. Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top