2012-02-13 81 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+" }") 
)