Nie ma $move
w MongoDB
. Biorąc to pod uwagę, najłatwiejszym rozwiązaniem jest podejście dwufazowe:
Ważną częścią tutaj, aby upewnić się, że wszystko jest idempotentne, jest uwzględnienie oryginalnego dokumentu tablicy w zapytaniu o aktualizację.
Otrzymano dokument w następującej formie:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Powiedzmy, że chcesz przenieść { a: 1, b: 1 }
do innego pola, być może o nazwie someOtherArrayField
, chciałbyś zrobić coś takiego.
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 } })
Powód, dla którego używamy $elemMatch
jest upewnienie się, że pole, które zamierzamy usunąć z tablicy, nie zmieniło się od czasu, gdy po raz pierwszy przeszukaliśmy dokument. W połączeniu z $pull
nie jest to również absolutnie konieczne, ale zazwyczaj jestem zbyt ostrożny w takich sytuacjach. Jeśli w Twojej aplikacji nie ma paralelizmu, a masz tylko jedną instancję aplikacji, nie jest to absolutnie konieczne.
Teraz, gdy sprawdzamy wynikowy dokument, otrzymujemy:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}