私はMongoをデータベースとして使用しています。私はデータを持っています:
{
_id : '123'
friends: [
{name: 'allen', emails: [{email: '11111', using: 'true'}]}
]
}
今、私はモチーフのユーザーの友人のメールに行きたいです 'email、その_idは' 123 '私はこのように書きます:
db.users.update ({_id: '123'}, {$set: {"friends.0.emails.$.email" : '2222'} })
それは簡単ですが、emails配列に2つ以上のデータがある場合、間違っています。だから、私の質問は:ネストされたフィールドのデータをどのようにモチーフにすることができますか?ありがとう。
配列には 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番目のメールを更新します。
Mongooseを使用したソリューション:
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");
}
}
}
マルチレベルのアリーで何かを更新するのは本当にお尻の痛みです、私のやり方:深いレベルのアリーを交換してください。
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()でドキュメント全体が置き換えられますが、ドキュメントがかなり大きい場合は、ドキュメントの一部のみを置き換えることをお勧めします。
またはループを実行し、最上位レベルの配列と第2レベルの配列(iiおよびjj)の位置を使用して更新します。
私のアドバイスは、スキーマを設計するとき、その配列の更新を行わない限り、配列を別の配列に入れないでください。