Подтвердить что ты не робот

Данные обновления MongoDB во вложенном поле

Я использую Mongo для моей базы данных. У меня есть данные:

 {
   _id : '123'
   friends: [
     {name: 'allen', emails: [{email: '11111', using: 'true'}]}
   ]
 }

теперь я хочу мотивировать электронную почту электронных писем пользователей, чей _id является "123", Я пишу так:

db.users.update ({_id: '123'}, {$set: {"friends.0.emails.$.email" : '2222'} })

это легко, но, это неправильно, когда массив электронной почты имеет две или более данных. поэтому, мой вопрос: как я могу мотивировать данные во вложенной форме - просто есть два или более вложенных массива? Спасибо.

4b9b3361

Ответ 1

Для массивов вам необходимо использовать Dot Notation.

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

Например:

db.users.update ({_id: '123'}, { '$set': {"friends.0.emails.0.email" : '2222'} });

обновит первое электронное письмо первого друга и

db.users.update ({_id: '123'}, { '$set': {"friends.0.emails.1.email" : '2222'} })

обновит второе письмо первого друга.

Ответ 2

обновить что-то на многоуровневом уровне - это действительно боль в заднице, мой способ сделать это: заменить глубокий уровень arry.

db.user.findOne({_id:'123'},{friends:1}).lean().exec(function(err,user){
   var whichArrayToUpdate;
   for (var ii = 0; ii < user.friends.length; ii++) {
        for (var jj = 0; i < user.friends[ii].emails; jj++) {
            if(user.friends[ii].emails[jj].email == '1111' ){// update it below

                user.friends[ii].emails[jj].email == 'what ever you want to set to.';

                whichArrayToReplace = user.friends[ii].emails;
                break;
            }
        };
   };

   db.user.update({'friends.name':'allen'},{$set{'friends.$.email': whichArrayToReplace} })
})

но почему бы не использовать метод save()? save() заменит весь ваш документ, если ваш документ мал, что хорошо, но если ваш документ слишком велик, лучше заменить только часть вашего документа.

или выполните цикл, используйте положение массива верхнего уровня и массива второго уровня (ii и jj) для обновления.

Мой совет: когда вы разрабатываете схему, не помещайте массив в другой массив, если вы не сделаете никакого обновления для этого массива.

Ответ 3

Используя немного мангуста, вы можете сделать что-то вроде:

    Users.findById("123", function(err, user) {

      var friends = user.friends;
        for ( i=0; i < friends.length; i++ ) {
          if (friends[i].name == 'allen') {
            friends[i].email = '2222';

            user.save(function(err) {
              if (err) throw err;
              console.log("email updated");
            });
          } else {
            console.log("no friends named allen");
          }
        }

    }

Итак, вышеупомянутое решение делает следующее:
1. Находит пользователя с идентификатором 123.
2. Прокручивает друзей, пока не найдет allen.
3. Обновляет электронную почту с новым значением.

(вы можете добавить еще одно условие, чтобы найти определенный адрес электронной почты для обновления)