MongoDB のネストしたフィールドのデータを更新する

私はMongoをデータベースとして使用しています。

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

さて、私は 's friends' email 's _id が '123&#39 である email を motify したいのです。 というメールには、このように書きます。

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

というのは簡単ですが、配列に2つ以上のデータがある場合、それは間違っています。 そこで、質問です。 どのように私はネストされたファイル内のデータを動機づけすることができます---ちょうど2つ以上のネストされた配列を持っていますか?ありがとうございます。

ソリューション

配列にはドット記法を使用する必要があります。

つまり、$を更新しようとする要素のゼロベースのインデックスに置き換える必要があります'。

例えば

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番目の電子メールを更新します。

解説 (7)

多階層アリーの更新は非常に面倒なので、深層アリーを置き換えるという方法をとっています。

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)の位置を使用して更新します。

アドバイスとしては、スキーマを設計するときに、その配列の更新を行わない限り、配列を別の配列の中に入れてはいけないということです。

解説 (0)

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");
          }
        }

    }
解説 (0)