2012-02-13 37 views
3

聲明:我是Mongo和一般數據庫的小菜鳥,所以如果我對術語或概念不瞭解,請告訴我。如何執行MongoDB文檔字段的原子更新?

爲了本示例的目的,我想將鼠標座標一起存儲在嵌套在文檔中的對象中。該文件看起來是這樣的:

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

好像atomic updating, via modifier operations,是要走的路,因爲我只在這裏存儲的值(檢索它們在其他地方,在其他軟件中)。但是,我無法弄清楚查詢部分。如何訪問此文檔以設置x和y值?

我使用Java,所以我目前正試圖:

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

不過,我不知道如何指定queryObj得到與mouseLoc關鍵文檔。另外,如果有更聰明的方式來存儲這樣的信息,請給我上學。

如果更簡單,我可以跟隨Mongo shell/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」鍵。也許我只是誤解了數據庫/ mongo設計?

回答

0

查詢部分是指定查找文檔的方式,例如:_id或其他唯一字段。

在你的榜樣,它看起來就像這樣:

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

(也許有一些缺少有關ObjectId,因爲我不知道的Java)

UPDATE

如果你正在尋找一個特定的mouseLocqueryObj將是非常mouseLoc對象。 (在JSON中,它將是{ 'x': mouseX, 'y': mouseY }。)

+0

ObjectId實際上是直接從shell find()中直接複製的,它不是Java的東西。對,這就是我使用查詢參數的方式。不過,我想用一些「mouseLoc」鍵檢索文檔,而不管它的值如何。我誤解數據庫設計嗎?我必須有一個唯一的名稱 - 值對,比如你的「_id」例子,或者我上面使用「name」字段的更新嗎? – ericsoco 2012-02-13 22:57:55

+0

好,現在我明白你的意思了。我會更新我的答案。 – 2012-02-13 23:00:51

+0

@ericsoco要從其'mouseLoc'中檢索某個文檔,使其成爲'queryObj'。但是,如果要更新爲新的X和Y,則會有兩個'mouseLoc's:'mouseLocBefore'('queryObj')和'mouseLocAfter'(更新對象),並且可以在同一更新中使用兩者命令:'myCollection.update(mouseLocBefore,mouseLocAfter,true,false);'。 – 2012-02-13 23:12:22

0

使用.說明符怎麼樣?

myCollection.updateOne(Document.parse("{ \"_id\" : ObjectId(\"4f39805d35919a2a7c7aba3e\")}"), 
    Document.parse("{$set:{ \"mouseLoc.x\" : "+mouseX+", \"mouseLoc.y\" : "+mouseY+" }") 
) 
相關問題