通过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)