복붙노트

[MONGODB] 중첩 된 필드에서 MongoDB를 업데이트 데이터

MONGODB

중첩 된 필드에서 MongoDB를 업데이트 데이터

난 내 데이터베이스로 MongoDB를 사용하고 있습니다. 내가 데이터를 가지고 :

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

지금, 나는 누구의 ID입니다 '123'사용자의 친구 '이메일'이메일을 수정하려면 싶어 나는 다음과 같이 쓰기 :

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

이메일 배열이 두 개 이상의 데이터가 때, 그것은 잘못, 쉽게,하지만. 그래서, 내 질문은 : 내가 어떻게에서 데이터를 motify 수있는 중첩 제기 --- 두 개 이상의 중첩 된 배열을? 감사.

해결법

  1. ==============================

    1.당신은 배열의 점 표기법을 사용해야합니다.

    당신은 배열의 점 표기법을 사용해야합니다.

    즉, 업데이트하려는 요소의 제로로부터 시작되는 인덱스로 $를 교체해야한다.

    예를 들면 :

    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. ==============================

    2.멀티 레벨 배열의 업데이트 무언가가 그 일을 내 방식 엉덩이에 정말 고통입니다 : 깊은 수준의 배열을 교체합니다.

    멀티 레벨 배열의 업데이트 무언가가 그 일을 내 방식 엉덩이에 정말 고통입니다 : 깊은 수준의 배열을 교체합니다.

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

    하지만, 왜 저장 () 메소드를 사용하지? 저장 () 문서를 확인하지만 문서가 relly 큰 경우,이 문서의 한 부분을 대체 할 더 나은 아이디어가의 그 작은 경우, 전체 문서를 대체합니다.

    또는 루프를 수행 업데이트하는 최상위 레벨 어레이 및 제 어레이 (II와 JJ)의 위치를 ​​사용한다.

    내 충고입니다 : 당신이 스키마를 설계 할 때 그 배열에 대한 업데이 트를하지 않을 않는 한, 다른 배열에 배열을 넣지 마십시오.

  3. ==============================

    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");
              }
            }
    
        }
    
  4. from https://stackoverflow.com/questions/19603542/mongodb-update-data-in-nested-field by cc-by-sa and MIT license