tôi đã có doc sau trong db của tôi:Tại sao ký hiệu dấu chấm mongo thay thế toàn bộ một subdocument?
{
"_id": ObjectId("ABCDEFG12345"),
"options" : {
"foo": "bar",
"another": "something"
},
"date" : {
"created": 1234567890,
"updated": 0
}
}
Và tôi muốn cập nhật options.foo
và date.updated
cùng một lúc sử dụng ký hiệu dấu chấm, như vậy:
var mongojs = require('mongojs');
var optionName = 'foo';
var optionValue = 'baz';
var updates = {};
updates['options.' + optionName] = optionValue;
updates['date.updated'] = new Date().getTime();
db.myCollection.findAndModify({
query : {
_id : ObjectId('ABCDEFG12345')
},
update : {
$set : updates
},
upsert : false,
new : true
}, function(error, doc, result) {
console.log(doc.options);
console.log(doc.date);
});
Và kết quả này trong :
{
foo : 'baz',
another : 'something'
}
{
updated : 1234567890
}
Cụ thể, trường trước đây date.created
của tôi đang bị ghi đè mặc dù tôi là chúng tôi ng dấu chấm.
Tại sao điều này chỉ hoạt động một phần? Tài liệu phụ options
vẫn giữ lại dữ liệu đã tồn tại trước đó (options.another
), tại sao tài liệu phụ date
không giữ lại dữ liệu đã tồn tại trước đó của nó?
Tôi đã chạy mã trên và nhận được kết quả mong đợi '{foo: 'baz', một cái khác: 'something'} {created: 1234567890, updated: 1486112116738}'. Bạn có chắc chắn dữ liệu/mã của bạn như trên không? – sheilak
100%. Tôi phải kiểm tra nó 50 lần. Nó không có ý nghĩa, phải không? Tôi đã có các mô-đun khác sử dụng cùng một kỹ thuật và đạt được kết quả mong đợi, nhưng không phải vì lý do nào đó. Hy vọng sẽ tìm thấy một trường hợp cạnh tranh mà người khác đã gặp phải. – AJB
Tôi đồng ý với @sheilak nó cũng tốt cho tôi. AJB Bạn có thể vui lòng đăng các bước tài liệu và mã chính xác không. – Avi