2012-02-08 2 views
9

배열에 포함 된 전체 문서를 쉽게 교체 할 수 있습니까? 말 교체 :MongoDB 배열의 임베디드 문서 교체

{ 
    "_id" : "2", 
     "name" : "name2", 
     "xyz..." : "xyz2..." 
} 

로 : _id을 검색

{ 
    "_id" : "2", 
     "name" : "name6", 
     "xyz..." : "xyz5..." 
     "morefields..." : "fields..." 
} 

(임베디드). 또는 $ set을 사용하여 각 필드를 개별적으로 바꿔야합니까?

{ 
    "_id" : "2", 
    "users" : [{ 
     "_id" : "1", 
     "name" : "name1", 
     "xyz..." : "xyz1..." 
    }, { 
     "_id" : "2", 
     "name" : "name2", 
     "xyz..." : "xyz2..." 
    }], 
    "name" : "main name" 
} 

답변

18

"개체 배열"패턴을 사용하고 있습니다. 당신은 다음과 비슷한 모습이 될 것입니다는 positional operator 사용할 수있는 개체가 자연 ID가 있다면 내 경험에

coll.update({'_id':'2', 'users._id':'2'}, {$set:{'users.$':{ "_id":2,"name":"name6",... }}}, false, true) 

, 패턴 "오브젝트의 배열은"최적이 아니다. 귀하의 경우에,이 다음과 같이 모델링 할 수있다 :

{ 
    "_id" : "2", 
    "users" : 
    { "1" : { "name" : "name1", "xyz..." : "xyz1..." }, 
     "2" : { "name" : "name2", "xyz..." : "xyz2..." } 
    } 
    "name" : "main name" 
} 

을이 경우에 당신은 쉽게 당신이 원하는 항목을 업데이트 할 dot notation 사용할 수 있습니다.

var newValue = { "name" : "name6", "xyz..." : "xyz5...", "morefields..." : "fields..." }; 
coll.update({_id: 2}, { $set: { "users.2" : newValue } }); 
+0

정말 고마워! 두 번째 대안에 흥미가 있지만 중간에 일부 항목을 제거해야하므로 작동 여부를 확신 할 수 없습니다. "users.2"는 내가 생각하는 배열의 위치입니다. –

+0

나는 users.2가 배열 위치를 참조한다고 생각했지만 실제로는 다른 모든 배열 항목에 대해 빈 괄호를 반환하고있다. –

+0

MongoDB는 쿼리에서 배열을 인식하므로'users.2'는' 사용자 배열'key '가'2' * 인 객체를 찾거나'keys : 2'를'users'처럼 볼 수 있습니다. –

관련 문제