以下代码对我没用:
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。 怎么了,怎么做对了? 感谢。
答案 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);
}
所以你的代码是正确的,虽然我想指出一些关于风格的评论会使它更具可读性:
DBName
应为dbName
,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)));
}
答案 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
将根据需要创建嵌入的文档,以实现该字段的虚线路径。