当前位置: 首页 > 面试题库 >

如何使用Java驱动程序更新mongo db中的文档字段?

濮君植
2023-03-14
问题内容

参考文献:

  • http://www.mongodb.org/display/DOCS/Java+Tutorial

对于mongo db来说还算是新手,但是我正在尝试更新集合中现有文档的一部分…不幸的是,上面的链接没有更新示例。

本质上,我只希望能够:

  1. 向文档添加新字段
  2. 将文档的现有字段更新为新值

这是我的代码(Grails + Groovy + Java + MongoDB + Java驱动程序):

def shape = mongo.shapes.findOne(new BasicDBObject("data", "http://www.foo.com")); // get the document
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("isProcessed", 0));  // add a new "isProcessed" field set to 0
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("data", "http://www.bar.com"));

这几乎掩盖了整个对象…我可以尝试仅修改原始形状对象,然后在其上运行更新。但是在那之前,有 没有人有只更新单个字段(而不是整个文档)的经验?

编辑:

我只是尝试了一下,并且能够通过将整个对象与新的和/或更新的字段一起发送来成功更新,并且有效。我想知道驱动程序是否足够聪明,只能更新最小的更改子集,还是只是盲目地更新整个事情?(在以下情况下,它只是更新导线或整个形状文档中的foo字段吗?)

码:

def shape = mongo.shapes.findOne(); // get the first shape to use as a base
shape.removeField("_id");  // remove the id field
shape.put("foo","bar");  // add a new field "foo"
mongo.shapes.insert(shape);  // insert the new shape
def shape2 = mongo.shapes.findOne(new BasicDBObject("foo", "bar"));  // get the newly inserted shape (and more importantly, it's id)
shape2.put("foo", "bat");  // update the "foo" field to a new value
mongo.shapes.update(new BasicDBObject("_id", shape2._id), shape2);  // update the existing document in mongo

问题答案:

我想知道驱动程序是否足够聪明,只能更新最小的更改子集,还是只是盲目地更新整个事情?

不,如果您使用“常规”更新方法,则整个对象将通过网络发送。我怀疑数据库服务器本身将足够聪明,仅在可能的情况下仅更新必要的索引(而不是未更改的索引)(即,对象可以在适当的位置更新并且不必移动,因为它也增长了)许多)

您可以使用“原子更新修饰符”功能。Java文档对它们有所帮助,但是由于驱动程序只是传输JSON,因此非Java教程中的内容应该可以工作,例如:

shapes.update((DBObject)JSON.parse(    "{ 'foo' : 'bar'}"),  
    (DBObject) JSON.parse(          "{ '$set' : { 'foo': 'bat'}}")   );


 类似资料:
  • < li >感谢您点击这个问题!我已经尽了最大努力让这件事尽可能彻底。 < li >但是,如果您需要进一步澄清,请随时告诉我! < li >如果您认为问题太长。你可以读第三个 Mongodb Java 驱动程序: org.mongodb:mongo-java-driver:3.11.0-rc0 查找具有特定“名称”字段的特定文档 然后更新其他字段或整个文档 从不返回null。 Java只告诉我它返

  • 问题内容: 我正在尝试通过搜索“ _id”键在MongoDB中查找文档。我的文件看起来像这样- 我正在尝试将此文档搜索为- 但我得到以下错误- BasicDBObject的append方法支持(字符串键,值),如果我将“ _id”作为String传递给此方法,则不会匹配任何文档。 所以我的问题是如何传递“ _id”? 问题答案: 通过使用as作为查询来解决

  • 你好,我有这个文件 我想知道如何使用参数识别文档,并通过查找带有“Car”参数的产品并使用MongoDB Java驱动程序将价格更新为15来更新参数中的特定对象。 谢谢你

  • 有人能给我举个例子,说明如何使用PHPs新驱动程序计算MongoDB集合中的文档数吗(http://php.net/manual/en/set.mongodb.php) 所有示例似乎都在使用旧的驱动程序或库!

  • 我想在这里完成的事情很简单。我正在尝试更新MongoDB集合中的单个文档。当我使用任何字段(如“name”)查找文档时,更新查询成功。以下是查询: 如果我试图用ObjectId查找文档,它永远不会工作,因为它与任何文档都不匹配。 是否有可能使此查询与对象ID一起工作? 我同意我的问题有点类似于如何使用Java mongodb驱动程序中的“_id”字段查询文档?但是,我在尝试更新文档时没有收到任何错

  • 作为mongodb世界的新成员,当我试图在一个集合中复制一个mongo文档时遇到了麻烦。复制的意思是,我想把旧文档复制到一个新文档中,这个新文档有一个new _id字段,并改变几个字段的值。 mongodb java驱动程序是我的操作环境。 有人已经这样做了吗?