通过Java API向MongoDB中的现有文档添加带有值的字段

时间:2014-01-08 07:26:04

标签: 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.getDB(DBName).getCollection(collName).update(new BasicDBObject().append("_id", docID), setNewFieldQuery);
}

其中mongoClient变量的类型是MongoClient。

它的灵感来自Add new field to a collection in MongoDB。 怎么了,怎么做对了? 感谢。

2 个答案:

答案 0 :(得分:6)

我编写了一个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);
}

所以你的代码是正确的,虽然我想指出一些关于风格的评论会使它更具可读性:

  1. 参数和变量应以小写字母开头。 DBName应为dbName
  2. 您不需要new BasicDBObject().append(key, value)使用new BasicDBObject(key, value)
  3. 此代码与您的代码完全相同,但更短更简单:

    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)));
    }
    

答案 1 :(得分:0)

  

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

updateOne方法具有以下form

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

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

     

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

     

更新-要应用的修改。

因此,如果您想使用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将根据需要创建嵌入的文档,以实现该字段的虚线路径。