Как добавить новые поля существующим пользователям

У меня большое дело - приложение метеора, которое я разрабатывал последние недели, наконец-то в сети. Но для обновления мне нужно добавить поле в мой профиль пользователя.

Я думал, что сработает метод ограждения со следующим кодом:

updateUsrs_ResetHelps: function(){
  if(Meteor.users.update({}, {
    $set: {
      'profile.helps': []
    }
  }))
    console.log("All users profile updated : helps reset");
  else
    throw new Meteor.Error(500, 'Error 500: updateUsrs_ResetHelps', 
      'the update couldn\'t be performed');
}

Проблема в том, что у моих пользователей есть классический документ Meteor.accounts с электронной почтой, _id, услугами, профилем и т. д., но в профиле у них нет полей .helps. Мне нужно его создать.

Для будущих пользователей я изменил функцию создания учетных записей, чтобы добавить эти поля при регистрации, но для 200 пользователей, которых я уже зарегистрировал, мне действительно нужно решение.

РЕДАКТИРОВАТЬ: Может быть, это из-за селектора в обновлении? Подходит ли простой селектор {} для одновременного обновления всех пользователей/документов коллекции?


person David Panart    schedule 29.05.2015    source источник


Ответы (1)


Из документации Mongo (http://docs.mongodb.org/manual/reference/method/db.collection.update/):

По умолчанию метод update() обновляет один документ. Установите параметр Multi, чтобы обновить все документы, соответствующие критериям запроса.

Если вы уже позаботились о добавлении поля для новых пользователей и вам нужно просто исправить старых, почему бы просто не сделать это один раз прямо в базе данных?

Запустите meteor, чтобы запустить приложение, затем meteor mongo, чтобы подключиться к базе данных. Затем запустите обновление записей, в которых поле еще не существует. Что-то типа:

db.users.update({"profile.helps": {"$exists": false}}, {"$set": {"profile.helps": []}}, {multi:true})

Документация Mongo определяет параметр multi как:

Необязательный. Если установлено значение true, обновляются несколько документов, соответствующих критериям запроса. Если установлено значение false, обновляет один документ. Значение по умолчанию неверно.

person Mark Leiber    schedule 29.05.2015
comment
Ну, не знал, что я могу это сделать, большое спасибо, вы меня спасли :) Ожидание или ответ, я обманул его, выбрав всех пользователей и зациклившись на них через некоторое время, чтобы обновить их один за другим. Итак, теперь у них у всех есть поля, но я думаю, есть более быстрый способ глобально изменить значение для каждого документа/пользователя? Тем не менее, большое спасибо за подсказку :) - person David Panart; 29.05.2015
comment
@DavidPanart, я обновил свой ответ, чтобы показать использование параметра multi для обновления нескольких записей. - person Mark Leiber; 29.05.2015