通过Java API将具有值的字段添加到MongoDB中的现有文档中

通过Java API将具有值的字段添加到MongoDB中的现有文档中,java,mongodb,Java,Mongodb,以下代码对我不起作用: 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.

以下代码对我不起作用:

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

它的灵感来自。 什么是错的,怎么做才是对的?
谢谢。

我编写了一个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);
}
因此,您的代码是正确的,尽管我想指出一些关于样式的注释,以使其更具可读性:

  • 参数和变量应以小写字母开头
    DBName
    应为
    DBName
  • 您不需要
    newbasicdbobject().append(key,value)
    使用
    newbasicdbobject(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)));
    }
    

    我已经编写了一个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);
    }
    
    因此,您的代码是正确的,尽管我想指出一些关于样式的注释,以使其更具可读性:

  • 参数和变量应以小写字母开头
    DBName
    应为
    DBName
  • 您不需要
    newbasicdbobject().append(key,value)
    使用
    newbasicdbobject(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)));
    }
    
    要更新集合中的现有文档,可以使用集合的updateOne()或updateMany方法

    updateOne方法具有以下功能:

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

    指定一个空文档{},以更新在中返回的第一个文档 收藏

    更新-要应用的修改

    因此,如果您想使用Mongodb Java driver 3.4+再添加一个字段,它将是:

    collection.updateOne(new Document("flag", true),
                            new Document("$set", new Document("title", "Portable Space Ball")));
    
    以下操作更新单个文档,其中
    标志:true

    或者按照同样的逻辑:

    collection.updateOne(eq("flag", true),
                                new Document("$set", new Document("title", "Portable Space Ball")));
    
    如果
    标题
    字段不存在,将添加具有指定值的新字段,前提是新字段不违反类型约束。如果为不存在的字段指定虚线路径,
    $set
    将根据需要创建嵌入文档,以实现该字段的虚线路径

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

    updateOne方法具有以下功能:

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

    指定一个空文档{},以更新在中返回的第一个文档 收藏

    更新-要应用的修改

    因此,如果您想使用Mongodb Java driver 3.4+再添加一个字段,它将是:

    collection.updateOne(new Document("flag", true),
                            new Document("$set", new Document("title", "Portable Space Ball")));
    
    以下操作更新单个文档,其中
    标志:true

    或者按照同样的逻辑:

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

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

    您的代码应该可以工作。一件事可以是
    \u id
    字段。它真的是
    String
    还是
    ObjectId
    ?如果后者为真,请将代码更改为
    append(“\u id”,new ObjectId(docID))
    @orid几乎肯定是正确的-字符串docID将与ObjectId()类型不匹配。它以什么方式不起作用?是有错误,还是没有得到预期的结果?另外,您不需要执行
    newbasicdbobject().append(key,value)
    您只需执行
    newbasicdbobject(key,value)
    您的代码就可以正常工作。一件事可以是
    \u id
    字段。它真的是
    String
    还是
    ObjectId
    ?如果后者为真,请将代码更改为
    append(“\u id”,new ObjectId(docID))
    @orid几乎肯定是正确的-字符串docID将与ObjectId()类型不匹配。它以什么方式不起作用?是有错误,还是没有得到预期的结果?另外,您不需要执行
    newbasicdbobject().append(key,value)
    您只需执行
    newbasicdbobject(key,value)