声明:我是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设计?
ObjectId实际上是直接从shell find()中直接复制的,它不是Java的东西。对,这就是我使用查询参数的方式。不过,我想用一些“mouseLoc”键检索文档,而不管它的值如何。我误解数据库设计吗?我必须有一个唯一的名称 - 值对,比如你的“_id”例子,或者我上面使用“name”字段的更新吗? – ericsoco 2012-02-13 22:57:55
好,现在我明白你的意思了。我会更新我的答案。 – 2012-02-13 23:00:51
@ericsoco要从其'mouseLoc'中检索某个文档,使其成为'queryObj'。但是,如果要更新为新的X和Y,则会有两个'mouseLoc's:'mouseLocBefore'('queryObj')和'mouseLocAfter'(更新对象),并且可以在同一更新中使用两者命令:'myCollection.update(mouseLocBefore,mouseLocAfter,true,false);'。 – 2012-02-13 23:12:22