Non ci sono $move
in MongoDB
. Detto questo, la soluzione più semplice è un approccio in 2 fasi:
La parte importante qui, per assicurarsi che tutto sia idempotente, è includere il documento dell'array originale nella query per l'aggiornamento.
Dato un documento della seguente forma:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Diciamo che vuoi spostare { a: 1, b: 1 }
in un campo diverso, magari chiamato someOtherArrayField
, vorresti fare qualcosa del genere.
var doc = db.col.findOne({_id: "foo"});
var arrayDocToMove = doc.arrayField[0];
db.col.update({_id: "foo", arrayField: { $elemMatch: arrayDocToMove} }, { $pull: { arrayField: arrayDocToMove }, $addToSet: { someOtherArrayField: arrayDocToMove } })
Il motivo per cui utilizziamo $elemMatch
è per essere sicuri che il campo che stiamo per rimuovere dall'array non sia cambiato da quando abbiamo interrogato per la prima volta il documento. Se abbinato a un $pull
inoltre non è strettamente necessario, ma in genere sono eccessivamente cauto in queste situazioni. Se non c'è parallelismo nella tua applicazione e hai solo un'istanza dell'applicazione, non è strettamente necessario.
Ora, quando controlliamo il documento risultante, otteniamo:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}