Как обновить значение поля в mongo?

Так выглядит схема бд:
{"_id":"563f480fb5c2187503eefc1a","ownerBy":"56335521f2f4a3150349d78d","data":{"username1":"76561198060520554","username2":"76561198060520554","username3":"76561198060520554","username4":"76561198060520554","username5":"76561198060520554"},"__v":0}

От клиента приходит объект вида:
{ newValue: 'as76561198060520554',
  id: 'username1',
  column: 'selectable' }

Как найти поле(id) и заменить значение на newValue?
  • Вопрос задан
  • 1339 просмотров
Пригласить эксперта
Ответы на вопрос 2
srsd
@srsd
Как то так:
db.collection.find({ "data.username1" : {$exists: true}}).forEach( function(myDoc) { db.collection.update({_id: myDoc._id}, {$set: {"data.username1": myDoc.newValue}} )});
Если я правильно понял хитросплетение ваших данных.
Ответ написан
Комментировать
@lega
db.collection.update({ 'data.username1': {$exists: true} }, { $set: { 'data.username1': newValue }}, true)

Такой запрос должен обновить все документы где есть это поле, но т.к. запрос без индекса (и не сделать адекватный на эти данные), то будет перебор всех документов - это медленно и будет тормозить на большой коллекции.
Поэтому лучше сделать "вспомогательные данные" для массива - продублировать идентификаторы в массив:
{
  "_id":"563f480fb5c2187503eefc1a"
  "ownerBy":"56335521f2f4a3150349d78d",
  "data":{"username1":"76561198060520554","username2":"76561198060520554"...},
  "__v":0,
  userList: ['username1', 'username2', 'username3']
}

И сделать индекс: db.collection.ensureIndex({userList: 1})

Этот список userList, можно обновлять в той же команде что и данные с помощью $addToSet (и $pull для удаления из списка).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы