Không có $ move
trong MongoDB
. Có thể nói, giải pháp đơn giản nhất là cách tiếp cận 2 giai đoạn:
- Truy vấn tài liệu
- Tạo bản cập nhật bằng mã
$ pull >
và$ push
/$ addToSet
Phần quan trọng ở đây, để đảm bảo rằng mọi thứ đều là không quan trọng, là đưa tài liệu mảng ban đầu vào truy vấn cho bản cập nhật.
Đưa ra một tài liệu có dạng sau:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Giả sử bạn muốn di chuyển {a:1, b:1}
đến một trường khác, có thể được gọi là someOtherArrayField
, bạn muốn làm điều gì đó giống như.
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 } })
Lý do chúng tôi sử dụng $ elemMatch
là đảm bảo trường chúng ta sắp xóa khỏi mảng không thay đổi kể từ lần đầu tiên chúng ta truy vấn tài liệu. Khi được kết hợp với $ pull
nó cũng không hoàn toàn cần thiết, nhưng tôi thường thận trọng quá mức trong những tình huống này. Nếu ứng dụng của bạn không có tính song song và bạn chỉ có một phiên bản ứng dụng, thì điều đó không hoàn toàn cần thiết.
Bây giờ khi chúng tôi kiểm tra tài liệu kết quả, chúng tôi nhận được:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}