Đây là một câu hỏi lớn, bạn có cần tận dụng các hoạt động "addToSet" và "push" của Mongo không? Nếu bạn thực sự định chỉ sửa đổi các mục riêng lẻ trong mảng, thì bạn có thể nên xây dựng các mảng này dưới dạng đối tượng.
Đây là cách tôi sẽ cấu trúc nó:
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
Về cơ bản, điều này chuyển đổi mọi thứ thành các đối tượng JSON thay vì mảng. Bạn mất khả năng sử dụng $push
và $addToSet
nhưng tôi nghĩ điều này làm cho mọi thứ dễ dàng hơn. Ví dụ:truy vấn của bạn sẽ giống như sau:
db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})
Bạn cũng sẽ nhận thấy rằng tôi đã kết xuất "ID". Khi bạn lồng những thứ như thế này, bạn thường có thể thay thế "ID" bằng cách chỉ sử dụng số đó làm chỉ mục. Khái niệm "ID" hiện đã được ngụ ý.
Tính năng này đã được thêm vào trong phiên bản 3.6 với các bản cập nhật nhanh chóng.
db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )