2013-07-26 4 views
0

이것은 내 샘플 문서입니다.mongo에서 내부 문서 업데이트

{ 
    "_id" : ObjectId("51f20148a85e39af87510305"), 
    "group_name" : "sai", 
    "privileges" : [ 
     "Notification", 
     "News Letter" 
    ], 
    "users" : [ 
     { 
      "full_name" : "sumit", 
      "user_name" : "sumitdesh", 
      "password" : "magicmoments", 
      "status" : "Active" 
     }, 
     { 
      "full_name" : "ad", 
      "user_name" : "asd", 
      "password" : "asdf", 
      "status" : "Active" 
     } 
    ] 
} 

사용자 배열의 내부 문서를 새 문서로 바꾸고 싶습니다.

내 자바 코드입니다 : 어떤 도움이

을 감사

BasicDBObject g1=new BasicDBObject(); 
g1.put("full_name", "ram"); 
g1.put("user_name", "ram123"); 
g1.put("password", "pass$123"); 
g1.put("status", "Inactive"); 
BasicDBObject doc=new BasicDBObject(); 
doc.put("users",g1); 
BasicDBObject q=new BasicDBObject("users.user_name","asd"); 
con.update(q,doc); 

내가이 값을 내부 문서를 교체하려면 다음과 같이

예상 출력은

{ 
     "_id" : ObjectId("51f20148a85e39af87510305"), 
     "group_name" : "sai", 
     "privileges" : [ 
      "Notification", 
      "News Letter" 
     ], 
     "users" : [ 
      { 
       "full_name" : "sumit", 
       "user_name" : "sumitdesh", 
       "password" : "magicmoments", 
       "status" : "Active" 
      }, 
      { 
       "full_name" : "ram", 
       "user_name" : "ram123", 
       "password" : "pass$123", 
       "status" : "Inactive" 
      } 
     ] 
    } 
+0

나는 당신이하고 싶은 것이 성취 할 수 있다고 확신하지만 그것이 무엇인지 이해하는데 어려움을 겪고있다. 질문을 편집하여 출력 BSON 객체가 무엇을 기대하는지 보여 줄 수 있습니까? –

답변

1

나는 $set$ 연산자를 결합해야하며, 배열의 특정 항목을 업데이트 할 수 있습니다.

BasicDBObject g1 = new BasicDBObject(); 
g1.put("users.$.full_name", "ram"); 
g1.put("users.$.user_name", "ram123"); 
g1.put("users.$.password", "pass$123"); 
g1.put("users.$.status", "Inactive"); 

BasicDBObject doc = new BasicDBObject(); 
doc.put("$set", g1); 

BasicDBObject q = new BasicDBObject("users.user_name","asd"); 
con.update(q,doc); 
0

귀하의 코드 것 새 사용자만으로 구성된 새 문서를 만듭니다. 기존 문서에서 배열에 새 요소를 추가하려면 기존 문서의 필드를 수정하려면 $ 푸시 운영자에게

BasicDBObject where = new BasicDBObject("_id", new ObjectId("51f20148a85e39af87510305"); 
BasicDBObject doc = //... your new user object 
BasicDBObject push = new BasicDBObject("$push", doc); 
con.update(where, push); 

를 사용하는 경우는 $ -placeholder과 함께 집합 연산자를 사용할 수 있습니다. 이것은 "바"

BasicDBObject where = new BasicDBObject("users.user_name", "foo"); 
BasicDBObject value = new BasicDBObject("users.$.user_name", "bar"); 
BasicDBObject set = new BasicDBObject("$set", value); 
con.update(where, set); 

에 "foo는"에서 _ 이름을 변경하지만 데이터베이스에서 개체를 검색 할 때 가장 두통 유도 방법은 단지 주변 전체 DBOBJECT을 유지하는 것입니다, 미러 DBOBJECT의 모든 수정, 다음을 호출하십시오.

con.save(dbObject); 

ORM 랩퍼 라이브러리는 이것을 수행 할 수 있습니다. 그러나 가장 쉬운 방법이지만 전체 문서가 데이터베이스로 전송되므로 가장 효율적인 방법은 아닙니다. 이것은 쓰기가 빈약하고 문서가 작을 때 "조기 최적화"하에 쉽게 제기 할 수있는 문제이지만, 자주 저장하고 거대한 문서를 가지고있을 때 문제가 될 수 있습니다.

0

문서를 읽는 경우 실제로 이것은 매우 간단합니다.

첫 번째 어려움은 업데이트 할 문서를 찾는 것입니다.

{'users.user_name': 'asd'} 

필드 이름은 (는 복합 명 년대 몽고 쉘에서 탈출 할 필요가 다음과 같은 질문을 통해, 오히려 깔끔하게 이루어집니다 그 user_name 필드 'ASD'인 사용자를 찾고)하지만 Java에 대해서는 걱정할 필요가 없습니다.

이제 사용자를 찾았 으면이를 변경해야합니다. MongoDB의 마술 당신이로 업데이트 기준을 작성할 수 있습니다 $과 일치하는 배열 인덱스, 저장 : 당신은 분명히 자바 커넥터 주위에 당신의 방법을 알고

{ 
    $set: { 
     'users.$': { 
      full_name: 'ram', 
      user_name: 'ram123', 
      password: 'pass$123', 
      status: 'inactive' 
     } 
    } 
} 

을, 나는 인스턴스 내 JSON 객체의 변환을 떠날거야 BasicDBObject.