如何执行MongoDB文档的字段的原子更新?

时间:2012-02-13 22:04:58

标签: java mongodb atomic database

免责声明:我是Mongo和一般数据库的菜鸟,所以如果我关注术语或概念,请告诉我。

出于本示例的目的,我想将鼠标坐标存储在嵌套在文档中的对象中。该文件看起来像:

{ "_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提示。


更新:
如果我给它一个像'name'这样的静态字段,我可以查询这个文档。因此,要更新此文档:

{ "_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”键检索文档,必须指定“name”字段似乎是多余的。也许我只是误解了数据库/ mongo设计?

2 个答案:

答案 0 :(得分:0)

您可以在查询部分指定查找文档的方法,例如:_id或其他唯一字段。

在您的示例中,它将如下所示:

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

(可能缺少ObjectId,因为我不懂Java。)

<强>更新

如果您要搜索特定的mouseLocqueryObj将是mouseLoc对象。 (在JSON中它将是{ 'x': mouseX, 'y': mouseY }。)

答案 1 :(得分:0)

使用.说明符怎么样?

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