Để di chuyển phần tử từ mảng này sang mảng khác dựa trên điều kiện, sử dụng forEach() kết hợp JavaScript array methods (filter) và save().
Tạo collection với 2 mảng
> db.demo646.insertOne({
"Information": [
{ id: 100, Name: "Chris" },
{ id: 100, Name: "Chris" },
{ id: 101, Name: "David" },
{ id: 100, Name: "Chris" }
],
"different": []
});
Hiển thị trước khi di chuyển
> db.demo646.find().pretty();
Kết quả: Information có 4 phần tử (3 Chris id=100, 1 David id=101), different rỗng
Di chuyển phần tử id=101 từ Information sang different
> db.demo646.find({}).forEach(function(d) {
d.different = d.Information.filter(function(v) { return v.id == 101 });
d.Information = d.Information.filter(function(v) { return v.id != 101 });
db.demo646.save(d);
})
Kết quả sau di chuyển
> db.demo646.find().pretty();
Kết quả:
{
"Information": [
{ "id": 100, "Name": "Chris" },
{ "id": 100, "Name": "Chris" },
{ "id": 100, "Name": "Chris" }
],
"different": [
{ "id": 101, "Name": "David" }
]
}
Giải thích:
forEach: Duyệt từng document trong collectionfilter(v => v.id == 101): Lấy phần tử có id=101 gán vàodifferentfilter(v => v.id != 101): Giữ lại phần tử KHÔNG có id=101 gán lạiInformationsave(d): Lưu toàn bộ document đã sửa đổi (upsert nếu _id tồn tại)
Cách hiện đại (MongoDB 4.2+): Dùng updateMany với pipeline aggregation:
db.demo646.updateMany(
{},
[{
$set: {
different: { $filter: { input: "$Information", cond: { $eq: ["$$this.id", 101] } } },
Information: { $filter: { input: "$Information", cond: { $ne: ["$$this.id", 101] } } }
}
}]
)
Cách này atomic, không cần round-trip client-server, hiệu năng tốt hơn nhiều.