【问题标题】:Add field with value to existing document in MongoDB via Java API通过 Java API 向 MongoDB 中的现有文档添加具有值的字段
【发布时间】:2014-01-08 07:26:03
【问题描述】:

以下代码对我不起作用:

public void addFieldWithValueToDoc(String DBName, String collName, String docID, String key, String value) {
    BasicDBObject setNewFieldQuery = new BasicDBObject().append("$set", new BasicDBObject().append(key, value));
    mongoClient.getDB(DBName).getCollection(collName).update(new BasicDBObject().append("_id", docID), setNewFieldQuery);
}

其中 mongoClient 变量的类型是 MongoClient。

它的灵感来自 Add new field to a collection in MongoDB 。 出了什么问题以及如何正确处理? 谢谢。

【问题讨论】:

  • 您的代码应该可以工作。一件事可以是_id 字段。真的是String 还是ObjectId?如果后者为真,请将您的代码更改为append("_id", new ObjectId(docID))
  • @orid 几乎可以肯定是正确的 - 字符串 docID 与 ObjectId() 类型不匹配。
  • 在什么方面没有奏效?是有错误,还是没有得到预期的结果?另外,你不需要做new BasicDBObject().append(key, value) 你可以简单地做new BasicDBObject(key, value)

标签: java mongodb


【解决方案1】:

我编写了一个 JUnit 测试来证明您的代码确实有效:

@Test
public void shouldUpdateAnExistingDocumentWithANewKeyAndValue() {
    // Given
    String docID = "someId";
    collection.save(new BasicDBObject("_id", docID));
    assertThat(collection.find().count(), is(1));

    // When
    String key = "newKeyName";
    String value = "newKeyValue";
    addFieldWithValueToDoc(db.getName(), collection.getName(), docID, key, value);

    // Then
    assertThat(collection.findOne().get(key).toString(), is(value));
}

public void addFieldWithValueToDoc(String DBName, String collName, String docID, String key, String value) {
    BasicDBObject setNewFieldQuery = new BasicDBObject().append("$set", new BasicDBObject().append(key, value));
    mongoClient.getDB(DBName).getCollection(collName).update(new BasicDBObject().append("_id", docID), setNewFieldQuery);
}

所以你的代码是正确的,尽管我想指出一些风格上的 cmets 会使其更具可读性:

  1. 参数和变量应以小写字母开头。 DBName 应该是 dbName
  2. 你不需要new BasicDBObject().append(key, value) 使用new BasicDBObject(key, value)

此代码与您的代码做同样的事情,但更短更简单:

public void addFieldWithValueToDoc(String dbName, String collName, String docID, String key, String value) {
    mongoClient.getDB(dbName).getCollection(collName).update(new BasicDBObject("_id", docID),
                                                             new BasicDBObject("$set", new BasicDBObject(key, value)));
}

【讨论】:

    【解决方案2】:

    要更新集合中的现有文档,可以使用集合的 updateOne() 或 updateMany 方法。

    updateOne 方法有以下form:

    db.collection.updateOne(filter, update, options)
    

    filter - 更新的选择标准。可以使用与 find() 方法中相同的查询选择器。

    指定一个空文档 { } 来更新返回的第一个文档 集合。

    update - 要应用的修改。

    所以,如果你想使用 Mongodb Java 驱动程序 3.4+ 再添加一个字段,那就是:

    collection.updateOne(new Document("flag", true),
                            new Document("$set", new Document("title", "Portable Space Ball")));
    

    以下操作更新flag:true所在的单个文档

    或者同理:

    collection.updateOne(eq("flag", true),
                                new Document("$set", new Document("title", "Portable Space Ball")));
    

    如果title 字段不存在,$set 将添加具有指定值的新字段,前提是新字段不违反类型约束。如果您为不存在的字段指定虚线路径,$set 将根据需要创建嵌入文档以实现字段的虚线路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 2021-06-04
      • 2020-07-04
      • 2023-02-14
      • 2012-10-27
      • 2014-07-20
      相关资源
      最近更新 更多