Không thể tăng trực tiếp giá trị trong .find
truy vấn if labelOptions
là một Mảng đối tượng. Để dễ dàng hơn, bạn nên thay đổi labelOptions
nhập từ Mảng đối tượng sang Đối tượng:
"labelOptions": {
"Bob": 112,
"Billy": 32,
"Joe": 45
};
Cũng nên xem xét sử dụng .findByIdAndUpdate
thay vì .findOneAndUpdate
nếu bạn đang truy vấn bằng _id
của tài liệu . Và sau đó, bạn có thể đạt được những gì mình muốn bằng cách:
Poll.findByIdAndUpdate(
id,
{$inc: {`labelOptions.${labelOption}`: 1 }},
function(err, document) {
console.log(err);
});
CẬP NHẬT:Nếu bạn kiên trì sử dụng Mảng đối tượng cho labelOptions
, có một cách giải quyết:
Poll.findById(
id,
function (err, _poll) {
/** Temporarily store labelOptions in a new variable because we cannot directly modify the document */
let _updatedLabelOptions = _poll.labelOptions;
/** We need to iterate over the labelOptions array to check where Bob is */
_updatedLabelOptions.forEach(function (_label) {
/** Iterate over key,value of the current object */
for (let _name in _label) {
/** Make sure that the object really has a property _name */
if (_label.hasOwnProperty(_name)) {
/** If name matches the person we want to increment, update it's value */
if (_name === labelOption) ++_label._name;
}
}
});
/** Update the documents labelOptions property with the temporary one we've created */
_poll.update({labelOptions: _updatedLabelOptions}, function (err) {
console.log(err);
});
});