MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoose - Erhöhen Sie einen Wert innerhalb eines Arrays von Objekten

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);
        });
    });