Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Di chuyển phần tử giữa các mảng trong MongoDB

Để 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 collection
  • filter(v => v.id == 101): Lấy phần tử có id=101 gán vào different
  • filter(v => v.id != 101): Giữ lại phần tử KHÔNG có id=101 gán lại Information
  • save(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.