2016-07-18 1 views
0

단일 필드로 mongodb json 문서를 업데이트하려고합니다. 내 데이터가 객체 배열에 있었지만 이유가 있고 조기 설계 선택 사항을 알 수 없다면 객체 내부의 객체 일 가능성이 높습니다. 내 컬렉션에서 단일 문서의Mongodb : 포함 된 문서에 필드 추가 (배열 없음)

구조 :

{ 
    "_id": 123123, 
    "drivers_teams": { 
    "drivers" : { 
     "4" : { <data> }, 
     "5" : { <data indeed> }, 
     ... 
    }, 
    ... 
    } 
} 
나는 새 개체 예를 들어

const collection = db.get('collection'); 
let drivers = { }; 
drivers['111'] = { <new data> }; 

collection.update({}, {$set: { drivers_teams: { drivers } }}, { upsert: true }, function (err, doc) { ... }); 

를 추가 할

그러나 결과는의 원래 목적은 "drivers_teams는"전멸하고있다한다는 것이다 그 안에 새로운 필드 만.

collection.update({}, {$set: { drivers }}, { upsert: true }, function (err, doc) { ... }); 

그것은 비 놀랍게도 drivers_teams 외부의 새로운 분야 "드라이버"

{ 
    "_id": 123123, 
    "drivers" : { <new data> }, 
    "drivers_teams": { <still original> } 
} 

유사 문제 (+ 솔루션)을 삽입 여기하지만 JSON은 광산처럼 중첩되지 않습니다

내가하려고하면 . https://groups.google.com/forum/#!topic/mongodb-user/ZxdsuIU94AY

내가 수행하려는 것을 성취 할 수있는 방법이 있습니까? 아니면 단일 필드를 업데이트하려고 할 때 전체 문서를 포기하고 덮어 써야합니까? 여기

편집

전문 솔루션 {$set: { 'drivers_teams.drivers.111': <data> }}이다하지만 내가 언급해야 할 것은 그 예를 들어 키 '111'이 업데이트 데이터를 보낼 때, 그것은 클라이언트에서 실제로 알 수없는 제공된다. 새로운 솔루션이이 솔루션으로 생성 된 이유는 다음과 같습니다. dynamically name mongo key field

{ 'drivers_teams.driver.' + key: <data> }과 같은 글을 쓰면 오류가 발생합니다.

답변

1

'$ set'의 문서에서 임베디드 문서 나 배열의 필드를 지정하기 위해 점 표기법을 사용할 수 있습니다. 귀하의 경우를 들어 당신이 할 수 있습니다 :

collection.update({}, 
    { 
     $set: { "drivers_teams.drivers.111": { <new data> }} 
    }, 
    { upsert: true }, function (err, doc) { ... }); 

https://docs.mongodb.com/manual/reference/operator/update/set/

편집 : 동적 필드 이름을 생성하는 경우, 당신은 할 수 있습니다 :

const collection = db.get('collection'); 
let set_obj= { }; 
set_obj['drivers_teams.driver.' + key] = { <new data> }; 

collection.update({}, {$set: set_obj }}) 
+0

그게 전부 야! 정말 고맙습니다! – spiritworld

0

당신은 위의 수준을 놓친 drivers 하위 문서. mongo 쉘, 나는 당신이 필요로하는 것은 생각 :

{ 
    "_id": 123123, 
    "drivers_teams": { 
    "drivers": { 
     "4": {...}, 
     "5": {...}, 
     "111": {...} 
    } 
    } 
} 

는 MongoDB에 의해 사용되는 점 표기법에 대한 자세한 내용은 Embedded Documents page를 참조하십시오 : 같은 문서를 업데이트합니다

db.collection.update({}, {$set: {'drivers_teams.drivers.111': {...}}}) 

될 수 있습니다.

관련 문제