Es ist nicht möglich, den Wert in .find
direkt zu erhöhen Abfrage ob labelOptions
ist ein Array von Objekten. Um es einfacher zu machen, sollten Sie die labelOptions
ändern Typ von Array of Objects zu Object:
"labelOptions": {
"Bob": 112,
"Billy": 32,
"Joe": 45
};
Erwägen Sie auch die Verwendung von .findByIdAndUpdate
statt .findOneAndUpdate
wenn Sie nach der _id
des Dokuments fragen . Und dann können Sie erreichen, was Sie wollen, indem Sie:
Poll.findByIdAndUpdate(
id,
{$inc: {`labelOptions.${labelOption}`: 1 }},
function(err, document) {
console.log(err);
});
UPDATE:Wenn Sie beharrlich Array of Objects für labelOptions
verwenden , gibt es eine Problemumgehung:
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);
});
});