я'м, используя Монго, чтобы быть моей базе. у меня есть данные:
в
{
_id : '123'
friends: [
{name: 'allen', emails: [{email: '11111', using: 'true'}]}
]
}
теперь, я хочу, чтобы motify пользователя's друзья' писем ' по электронной почте, чьи поля _id, это '123' я пишу так:
db.users.update ({_id: '123'}, {$set: {"friends.0.emails.$.email" : '2222'} })
это's легко, но это'ы не так , когда письма массива имеет два или больше данных. Итак, мой вопрос: как я могу motify данные во вложенной подал --- просто есть два или более вложенных массивов? Спасибо.
Вы должны использовать точку для массивов.
То есть, вы должны заменить $
с нуля индекс элемента, который вы'вновь пытается обновить.
Например:
db.users.update ({_id: '123'}, { '$set': {"friends.0.emails.0.email" : '2222'} });
буду обновлять первое сообщение от первого друга, и
db.users.update ({_id: '123'}, { '$set': {"friends.0.emails.1.email" : '2222'} })
будем обновлять второе письмо первого друга.
обновить что-то в многоуровневой Арри-это действительно боль в заднице, мой способ сделать это:заменить глубоком уровне Арри.
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 ()? сохранить() заменит весь ваш документ, если документ является небольшой, что's хорошо, но если документ очень большой , это'ы лучше заменить только часть документа.
или сделать петлю, используйте положение верхнего уровня массива и второго массива уровень(II и JJ) для обновления.
мой совет: когда вы проектируете схему, Дон'т положить массив в другой массив, если вы выиграли'т сделать какие-либо обновления для этого массива.
Решение с помощью Мангуста:
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");
}
}
}