2015-08-04 4 views
0
{ _id: 55c02ab7684c7a601ca24898, 
    title: 'this is a better poll', 
    link: 'this-is-a-better-poll', 
    creator: 'user', 
    __v: 0, 
    choices: 
    [ { text: 'Option 1', votes: 0 }, 
    { text: 'Option 2', votes: 0 } ] } 

Это пример опроса. Допустим, у меня их несколько в моей базе данных.Модель Mongoose - Обновление массива

мне нужно обновить количество голосов на запрос POST со стороны клиента путем сравнения Option быть размещены на сервере и сравнивая его с базой данных.

Поскольку существует несколько опросов в базе данных, я использую ссылки найти точный объект базы данных.

Я попробовал несколько способов: обновить подсчет голосов, но ничего не работает, изменение названия работает безупречно. Зачем?

Метод, который не удалось:

for example selection is: 
var selection = 'Option 1'; 
var link = 'this-is-a-better-poll'; 

1) Model.where({"choices.text": selection}).update({$set: {"choices.votes" : 1}}); 

2) Model.update({"choices.text": selection}, {'$set': {"choices.$.votes" : 1}}); 

3)  Model.findOne({ 
     link: link 
    }, function(err, found) { 
     if (err) { 
      return res.status(400).send({ 
       message: 'Error' 
      }); 
     } 
     if (found) { 
      console.log(found.choices); 
      var arr = found.choices; 
      for (var i = 0; i < arr.length; i++) { 
       if (arr[i].text == selection) { 
        arr[i].votes = 1 
        console.log(arr[i].votes = 1); 
       } 
       found.save(function(err) { 
        if (err) res.send(err); 
        res.status(200).send({ 
         message: 'Succes' 
        }); 
       }); 
      } 

     } 
    }); 

Как я могу решить эту проблему? Как обновить подсчет голосов при выборе?

ответ

1

Ваш выбор 2 должен отлично работать с небольшими изменениями:

Model.update(
    { 
     "_id": "55c02ab7684c7a601ca24898", 
     "choices.text": selection 
    }, 
    { "$inc": { "choices.$.votes" : 1 } }, 
    function(err,numAffected) { 

    } 
); 

Где $inc это то, что вы, вероятно, на самом деле хотите, чтобы сделать для того, чтобы «увеличить» подсчет голосов согласованного варианта.

В другой части есть оператор positional $, который работает с тем, чтобы взять элемент из выбора запроса "choices.text", где он соответствует индексу массива и передает его блоку «обновления» статута для обновления согласованного индекса.

Также обратите внимание, что в блоке «запрос» мы также запрашиваем значение документа _id. Вполне вероятно, что текст, подобный «Вариант 1», существует во многих документах, поэтому вы действительно хотите только голосовать по одному из них.

Также оператор «позиционный», упомянутый ранее, только когда-либо соответствует «одному» расположению массива на документ. Поэтому, если есть несколько вариантов «Вариант 1», тогда обновляется только «первое» совпадение.

Если вам необходимо обновить «более одного», вы делаете повторяющиеся операции, пока числовое значение не будет возвращено как 0 или каким-либо другим подходом, который вы хотите использовать там. Но только один из них будет соответствовать и обновляться за операцию.

So 1.) не работает из-за недостающего позиционного оператора. А также 2.), несмотря на другие проблемы, также очень плохо, поскольку он вводит чтение данных и внесение изменений в код, а затем «надеется», что ничто иное не изменило данные, прежде чем писать обратно на сервер.

Помимо проблем с один, это также несколько запросов к серверу, когда вы можете просто сделать только один.

+0

Это очень подробный ответ. Как вы думаете, было бы лучше добавить новый ключ в моей схеме, такой как (голосовой ключ), а не встраивание внутри выборов?Затем я добавляю все голосовые опции в проголосовавший ключ и выполняю совпадение и длину массива клиентской стороны для вычисления количества голосов. Это лучше? Так как все количество голосов должно отображаться только на стороне клиента. – cusX

+0

@cusX Не могу сказать, что именно вы действительно хотите без дополнительной информации. Лучше всего спросить, конечно, с новым вопросом, где вы можете объяснить случай, на который вы хотите получить ответы. –

Смежные вопросы