2014-07-12 1 views
0

은의 다음 문서를 가정 해 봅시다 :MongoDB를가 : 문서 전체를 교체 할 때 값을 증가하는 방법

{ 
    "_id" : ObjectId("53b986e2fe000000019a5a13"), 
    "name" : "Joe", 
    "birthDate" : "2080-12-11", 
    "publications" : [ 
    { "title" : "title 1", "description" : "description 1" }, 
    { "title" : "title 2", "description" : "description 2" } 
    ], 
    "version" : 1 
} 

이 같은 문서 전체를 교체해야 ...

db.test.update({"_id": ObjectId("53b986e2fe000000019a5a13")}, { 
    "_id" : ObjectId("53b986e2fe000000019a5a13"), 
    "name" : "Joe", 
    "birthDate" : "1980-12-11", 
    "publications" : [ 
    { "title" : "bye bye", "description" : "Blah blah" }, 
    { "title" : "title 2", "description" : "description 2" }, 
    { "title" : "title 3", "description" : "description 3" } 
    ] 
}) 

을 ... 문서 version도 하나씩 증가시켜야합니다. 이 경우 $inc이 허용되지 않으므로 다른 대안이 있습니까?

답변

1

당신은 나머지 필드 업데이트하는 $setversion를 업데이트 $inc 결합 할 수 있습니다 :

db.test.update({"_id": ObjectId("53b986e2fe000000019a5a13")}, { 
    $set: { 
     "name" : "Joe", 
     "birthDate" : "1980-12-11", 
     "publications" : [ 
      { "title" : "bye bye", "description" : "Blah blah" }, 
      { "title" : "title 2", "description" : "description 2" }, 
      { "title" : "title 3", "description" : "description 3" } 
     ] 
    }, 
    $inc: {version: 1} 
}) 
+0

...하지만 $ set을 사용하면 "10150 필드 이름 중복이 수정 자와 함께 허용되지 않습니다."... – j3d

+1

@ j3d 위의 예제는 쉘에서 실행할 때 작동합니다. 너 뭔가 다른 걸 시도 했니? – JohnnyHK

+0

예 ... 작동합니다. 문제는 선택기와 업데이트 개체가 모두 동일한 필드 (내 경우에는 _version)를 포함한다는 것입니다. 귀하의 성원에 진심으로 감사드립니다. – j3d

0

내가 증가와 같은 하위 문서에서 도매 교체를 결합 할 수있는 방법을 알고하지 않습니다를하지만, $set을 사용할 수 있도록 하위 문서에 데이터를 저장할 수 있다면 작동합니다.

> db.test.insert({ doc: { a: 1 }, version: 1 }) 

> db.test.update({ }, { $set: { doc: { b: 1 } }, $inc: { version: 1 } }) 

> db.test.find().pretty() 
{ 
    "_id" : ObjectId("53c1600fd904c83d877daf21"), 
    "doc" : { 
     "b" : 1 
    }, 
    "version" : 2 
} 

참고 doc 도매 대체 및 version의 증가. 최상위 레벨 (즉, 문서 구조를 변경하지 않음)에서 개별 필드를 설정하도록 선택하는 경우 물론 문제가 아니라면 제거 할 기존 값의 설정을 해제해야합니다. 물론 옵션이기도합니다.

관련 문제