CHỈNH SỬA
Chi tiết bị thiếu trong câu hỏi là trường bắt buộc để cập nhật thực sự nằm trong tài liệu phụ . Điều này thay đổi đáng kể câu trả lời:
Đây là hạn chế của những gì bạn có thể có thể làm với việc cập nhật các phần tử mảng. Và điều này được giải thích rõ ràng trong tài liệu . Chủ yếu là trong đoạn này:
Vì vậy, đây là điều. Đang cố gắng cập nhật tất cả của các phần tử mảng trong một câu lệnh như thế này sẽ không công việc. Để làm được điều này, bạn phải thực hiện những điều sau đây.
db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
doc.items.forEach(function(item) {
item.qty = 0;
});
db.warehouses.update({ "_id": doc._id }, doc );
})
Về cơ bản, đó là cách cập nhật mọi phần tử mảng.
multi cài đặt trong .update()
nghĩa là trên nhiều "tài liệu". Nó không thể được áp dụng cho nhiều phần tử của một mảng. Vì vậy, lựa chọn tốt nhất hiện nay là thay thế toàn bộ. Hoặc trong trường hợp này, chúng tôi cũng có thể thay thế cả toàn bộ tài liệu vì chúng tôi vẫn cần làm điều đó.
Đối với thực dữ liệu hàng loạt, sử dụng db.eval () . Nhưng vui lòng đọc tài liệu đầu tiên:
db.eval(function() {
db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
doc.items.forEach(function(item) {
item.qty = 0;
});
db.warehouses.update({ "_id": doc._id }, doc );
});
})
Đang cập nhật tất cả các phần tử trong một mảng trên toàn bộ bộ sưu tập không đơn giản.
Bản gốc
Khá chính xác những gì lỗi nói. Để sử dụng toán tử vị trí, bạn cần phải khớp một cái gì đó đầu tiên. Như trong:
db.warehouses.update(
// query
{
_id:ObjectId('5322f07e139cdd7e31178b78'),
"items.qty": { "$gt": 0 }
},
// update
{
$set:{"items.$.qty":0}
},
// options
{
"multi" : true,
"upsert" : true
}
);
Vậy trận đấu ở đâu điều kiện vây vị trí trong số các mục nhỏ hơn 0 thì chỉ mục đó được chuyển cho toán tử vị trí.
P.S :Khi muti là sự thật nó có nghĩa là nó cập nhật mọi tài liệu. Để lại nó false
nếu bạn chỉ có nghĩa là một . Cái nào là mặc định.