2016-12-10 4 views
0

я с трудом выяснить, как приращение значения в объекте в массивеMongoose - Увеличивает значение внутри массива объектов

Например я этот документ, основанный на Poll схемы:

{ 
    "_id": "584b2cc6817758118e9557d8", 
    "title": "Number of Skittles", 
    "description": "Test1", 
    "date": "Dec 9, 2016", 
    "__v": 0, 
    "labelOptions": [ 
    { 
     "Bob": 112 
    }, 
    { 
     "Billy": 32 
    }, 
    { 
     "Joe": 45 
    } 
    ] 
} 

Используя экспресс, я могу получить это далеко:

app.put('/polls/:id', function(req, res){ 
    let id = req.params.id; 
    let labelOption = req.query.labelOption; 
    Poll.findOneAndUpdate(
    {'_id' : id}, 
    {$inc: {`labelOptions.$.${labelOption}`: 1 }}, 
    function(err){ 
     console.log(err) 
    }) 

где labelOption является тот, который я хотел бы, чтобы увеличить его значение

Чтобы быть более кратким, у меня возникают проблемы с трансверсацией внутри документа.

ответ

2

Невозможно напрямую увеличить значение в запросе .find, если labelOptions является массивом объекта. Для того, чтобы сделать его проще, вы должны изменить тип labelOptions из массива объектов для объекта:

"labelOptions": { 
    "Bob": 112, 
    "Billy": 32, 
    "Joe": 45 
}; 

рассмотреть также с использованием .findByIdAndUpdate вместо .findOneAndUpdate при запросе на документ _id. И потом, вы можете добиться того, что вы хотите от:

Poll.findByIdAndUpdate(
    id, 
    {$inc: {`labelOptions.${labelOption}`: 1 }}, 
    function(err, document) { 
    console.log(err); 
}); 

UPDATE: Если вы настойчивы в использовании массива объектов для labelOptions, есть обходной путь:

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); 
     }); 
    }); 
Смежные вопросы