2012-02-13 3 views
3

면책 조항 : 저는 Mongo와 데이터베이스 전반에 대한 멍청한 생각입니다. 따라서 용어 나 개념에 대해 알고 싶으면 알려주십시오.MongoDB 문서의 필드를 원자 적으로 업데이트하는 방법은 무엇입니까?

이 예제에서는 문서 내에 중첩 된 개체 내에 마우스 좌표를 함께 저장하고 싶습니다. 그것은 atomic updating, via modifier operations처럼 보인다

{ "_id" : ObjectId("4f39805d35919a2a7c7aba3e"), "mouseLoc" : { "x" : 10, "y" : 20 } } 

, 이동하는 방법이 난 단지 여기에 값을 저장하고있어 같은 (다른 소프트웨어에서 다른 곳을 검색하는)입니다 : 그 문서는 같을 것이다. 그러나 나는 쿼리 부분을 이해할 수 없다. x 및 y 값을 설정하려면이 문서에 어떻게 액세스합니까?

내가 자바를 사용하고, 그래서 현재 노력하고있어 :

BasicDBObject mouseLoc = new BasicDBObject(); 
mouseLoc.put("x", mouseX); 
mouseLoc.put("y", mouseY); 
myCollection.update(queryObj, new BasicDBObject("$set", mouseLoc), true, false); 

그러나, 나는 queryObj이 mouseLoc 키를 사용하여 문서를 얻기 위해 지정하는 방법을 모르겠어요. 이와 같이 정보를 저장하는 더 똑똑한 방법이 있다면 학교에 보내 주시기 바랍니다.

더 간단하다면 Mongo 셸/JS 팁을 따라갈 수 있습니다.


UPDATE : 나는 그것을 '이름'과 같은 정적 필드를 주면
나는이 문서에 대해 조회 할 수 있습니다. 나는이 코드를 사용할 수 있습니다

{ "_id" : ObjectId("4f39805d35919a2a7c7aba3e"), "name" : "mouseLoc", "mouseLoc" : { "x" : 10, "y" : 20 } } 

: 그래서,이 문서를 업데이트 할 수 그러나

BasicDBObject mouseLoc = new BasicDBObject(); 
mouseLoc.put("x", mouseX); 
mouseLoc.put("y", mouseY); 

BasicDBObject queryObj = new BasicDBObject("name", "mouseLoc"); 
BasicDBObject updateObj = new BasicDBObject("$set", new BasicDBObject("mouseLoc", mouseLoc)); 

myCollection.update(queryObj, updateObj, true, false); 

을, "이름"필드 단지로 문서를 검색 할 수 있도록 지정해야하는 중복 보인다 "mouseLoc"키. 어쩌면 내가 데이터베이스/몽고 디자인을 오해 한 것일까?

답변

0

검색어 부분은 문서를 찾는 방법을 지정하는 곳입니다 (예 : _id 또는 다른 고유 한 입력란). 당신의 예에서

, 그것은 다음과 같이 표시됩니다

ObjectId objectId = new ObjectId("4f39805d35919a2a7c7aba3e"); 
BasicDBObject queryObj = new BasicDBObject("_id", objectId); 

(. 내가 자바를 알 수 없기 때문에 어쩌면, 대한 ObjectId 누락 뭔가있다)

UPDATE

하는 경우 특정 mouseLoc을 검색 중이면 queryObj은 매우 mouseLoc 개체입니다. JSON에서는 { 'x': mouseX, 'y': mouseY }이됩니다.

+0

실제로 ObjectId는 find() 쉘에서 바로 복사됩니다. Java는 아닙니다. 맞아, 그게 내가 어떻게 쿼리 매개 변수를 사용하는거야. 그러나, 그 값에 관계없이 "mouseLoc"키를 사용하여 문서를 검색하고 싶습니다. 데이터베이스 설계를 오해하고 있습니까? "_id"예와 같은 고유 한 이름 - 값 쌍 또는 위의 "name"필드를 사용하는 업데이트가 있어야합니까? – ericsoco

+0

좋아, 이제 너의 요점을 알아 냈어. 내 대답을 업데이트 할게. –

+0

@ericsoco'mouseLoc'에서 어떤 문서를 가져 오려면, 그것을'queryObj'로 만드십시오.그러나, 새로운 X와 Y로 업데이트한다면,'mouseLoc'의'mouseLocBefore' ('queryObj')와'mouseLocAfter' (업데이트 객체)가있을 것이고, 두 개의 동일한 업데이트에서 사용할 수 있습니다 명령 :'myCollection.update (mouseLocBefore, mouseLocAfter, true, false);'. –

0

. 지정자는 어떻게 사용하나요?

myCollection.updateOne(Document.parse("{ \"_id\" : ObjectId(\"4f39805d35919a2a7c7aba3e\")}"), 
    Document.parse("{$set:{ \"mouseLoc.x\" : "+mouseX+", \"mouseLoc.y\" : "+mouseY+" }") 
) 
관련 문제