免责声明:我对Mongo和数据库总体都不太了解,如果我的术语或概念有误,请告诉我。
为了举例说明,我想将鼠标坐标存储在一个文档内的嵌套对象中。该文档将类似于以下样式:
似乎通过修改器操作进行原子更新是可行的,因为我只在此处存储值(在其他软件中检索它们)。但是,我无法弄清楚查询部分。如何访问此文档以设置x和y值?我正在使用Java,所以我目前尝试: (链接)
然而,我不知道如何指定该queryObj以获取具有mouseLoc键的文档。或者,如果有一种更聪明的存储此类信息的方法,请指导我。
如果更简单的话,我可以跟随Mongo shell/JS提示。
更新:如果我给它一个静态字段像“name”,我可以查询这个文档。所以,要更新此文档:
为了举例说明,我想将鼠标坐标存储在一个文档内的嵌套对象中。该文档将类似于以下样式:
{ "_id" : ObjectId("4f39805d35919a2a7c7aba3e"), "mouseLoc" : { "x" : 10, "y" : 20 } }
似乎通过修改器操作进行原子更新是可行的,因为我只在此处存储值(在其他软件中检索它们)。但是,我无法弄清楚查询部分。如何访问此文档以设置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);
然而,似乎没有必要指定“name”字段才能使用“mouseLoc”键检索文档。也许我只是误解了数据库/ mongo设计?
mouseLoc
检索某些文档,请将其设置为queryObj
。但是,如果您要更新到新的 X 和 Y,则会有两个mouseLoc
:mouseLocBefore
(queryObj
)和mouseLocAfter
(更新对象),您可以在同一更新命令中同时使用两者:myCollection.update(mouseLocBefore, mouseLocAfter, true, false);
。 - Sony SantosmouseLoc
去检索一个文档;我正在更新到新的 X 和 Y。我不一定知道以前的 X 和 Y,例如当我重新启动应用程序并写入鼠标坐标时。简而言之,我不想仅为了写入新状态就存储先前的状态。听起来像是我需要某个已知状态(键 + 值)才能检索文档。正确吗? - ericsocomouseLoc
的文档,查询对象将使用$exists
。 - Sony Santos$exists
就是我一直在寻找的。看了$exists
的文档(http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24exists),发现它效率不高。这很有道理,我现在明白了,我的文档应该有一个带有唯一值的字段来标识文档,并可能提示其用途。感谢您坚持让我理解这一点 ;) - ericsoco$exists
不是低效的(只有一个带有mouseLoc
的文档)。文档中说:“... 因为它实际上必须扫描所有索引值”,但在这种特殊情况下,只有一个文档需要在mouseLoc
上进行索引。无论如何,随意根据您的需求对数据库进行建模。MongoDB 给了我们足够的自由! :) - Sony Santos