2014-09-28 3 views
0

위치 연산자 $mongo에 사용하여 중첩 배열의 요소를 업데이트하는 것은 불가능합니다. $은 한 단계 깊숙이 작동합니다. 나는 그것이 mongo 2.7에 요청 된 기능이라고 봅니다.Mongodb : 중첩 된 arrary의 요소를 변경하는 방법?

전체 문서 업데이트 one level up은 쓰기 충돌로 인해 옵션이 아닙니다. 예를 들어 'username'을 특정 보상 프로그램으로 변경할 수 있어야합니다.

아이디어 중 하나는 전체를 가져오고 수정하고 전체 'reward_programs' 요소를 푸시하지만 그 다음에 주문이 느슨합니다. 순서가 중요합니다.

{ 
    "_id:"0, 
    "firstname":"Tom", 
    "profiles" : [ 
       { 
        "profile_name": "tom", 
        "reward_programs:[ 
             { 
              'program_name':'American', 
              'username':'tomdoe', 
             }, 
             { 
              'program_name':'Delta', 
              'username':'tomdoe', 
             } 
             ] 
       } 
      ] 
} 

가 어떻게에 대해 구체적으로 'username''program_name'=Delta의 변경 갈 것 :

이 문서를 고려?

답변

1

더 많은 독서를 한 후에 현재로서는 mongodb에서 지원되지 않는 것처럼 보입니다. 위치 업데이트는 한 수준의 깊이에서만 지원됩니다. 이 기능은 mongodb 2.7에 추가 될 수 있습니다.

두 가지 해결 방법이 있습니다.

1) 데이터베이스 구조를 평평하게하십시오. 이 경우 'reward_programs'를 자신의 컬렉션으로 만들고 작업을 수행하십시오.

2) dicts의 배열 대신 dicts의 dicts를 사용하십시오. 그렇게하면 수정할 필요가있는 객체까지 절대 경로를 가질 수 있습니다. 이것은 쿼리 유연성에 단점을 가질 수 있습니다.

3) 나에게 해키 보인다하지만 당신은 또한 배열의 위치 인덱스의 발견 중첩 된 배열에있는 목록을 걷고 같은 것을 수행 할 수 있습니다 전체 문서 읽기

users.update({'_id': request._id, 'profiles.profile_name': profile_name}, {'$set': {'profiles.$.reward_programs.{}.username'.format(index): new_username}})  

4), 수정을 , 다시 쓰기. 그러나 쓰기 충돌이 발생할 수 있습니다.

처음에는 데이터베이스 구조를 설정하는 것이 매우 중요합니다. 그것은 당신이 그것을 어떻게 사용할 것인지에 정말로 달려 있습니다.

0

이 할 수있는 간단한 방법 :

doc = collection.find_one({'_id': 0}) 
doc['profiles'][0]["reward_programs"][1]['username'] = 'new user name' 
#replace the whole collection 
collection.save(doc) 
관련 문제