i'm menggunakan Mongo untuk database saya. saya punya data:
{
_id : '123'
friends: [
{name: 'allen', emails: [{email: '11111', using: 'true'}]}
]
}
sekarang, saya ingin motify pengguna's-teman' email ' email, dan _id adalah '123' saya menulis seperti ini:
db.users.update ({_id: '123'}, {$set: {"friends.0.emails.$.email" : '2222'} })
it's mudah, tapi , it's salah , ketika email array yang memiliki dua atau lebih data. jadi, pertanyaan saya adalah: bagaimana saya bisa motify data di bersarang diajukan --- hanya memiliki dua atau lebih bersarang array? Terima kasih.
Anda perlu menggunakan Dot Notasi untuk array.
Artinya, anda harus mengganti $
dengan nol berbasis indeks dari elemen yang anda're mencoba untuk memperbarui.
Misalnya:
db.users.update ({_id: '123'}, { '$set': {"friends.0.emails.0.email" : '2222'} });
akan memperbarui email dari teman yang pertama, dan
db.users.update ({_id: '123'}, { '$set': {"friends.0.emails.1.email" : '2222'} })
akan update kedua email dari teman yang pertama.
update sesuatu di multi level arry adalah benar-benar rasa sakit di pantat, cara saya melakukan itu:mengganti tingkat yang mendalam 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} })
})
tapi, mengapa tidak menggunakan metode save ()? save() akan mengganti seluruh dokumen, jika dokumen anda lebih kecil yang's ok, tapi jika dokumen anda relly besar , it's ide yang lebih baik untuk menggantikan hanya bagian dari dokumen anda.
atau melakukan loop, menggunakan posisi atas tingkat kenyamanan dan tingkat kedua array(ii dan jj) untuk update.
saran saya adalah: ketika anda merancang skema, don't menempatkan array dalam array lain kecuali jika anda tidak't melakukan update untuk yang menginap.
Solusi menggunakan Luwak:
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");
}
}
}