MONGO Aggiornamento dell'elemento di array e condizioni di corse?
-
12-11-2019 - |
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.value
TagCode 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!
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!