尝试使用 MongoDB Java 驱动程序更新文档
Trying to update a document using MongoDB Java Driver
谢谢
- 我只是想感谢您点击这个问题!我已尽最大努力使它尽可能彻底。
- 但是,如果您需要进一步澄清,请随时告诉我!
- 如果您觉得问题太长。您可以在此处阅读第三部分和第四部分,然后 post 您自己的解决方案!
设置
- Mongodb Java 驱动程序:org.mongodb:mongo-java-驱动程序:3.11.0-rc0
我想做什么
- 查找具有特定“名称”字段的特定文档。
- 然后更新其他字段或整个文档。
示例文档
// the document that I am trying to find in db
{
"_id":"5de6af7cfa42833bd9849477",
"name":"Richard Koba",
"skills":[]
}
// the document that I have
{
"name":"Richard Koba",
"skills":[jump, dance, sing]
}
// final result in db
{
"_id":"5de6af7cfa42833bd9849477",
"name":"Richard Koba",
"skills":[jump, dance, sing]
}
我现在在做什么
// finding a document with same "name" field as input doc and update it with doc
public MongoCollection updateDocument(Document doc, String colName) {
MongoCollection collection;
// make sure collection exist
try {
collection = connectCollection(colName); // returns MongoCollection Obj
} catch (CollectionNotFoundException e) {
MessageHandler.errorMessage(e.getMessage());
return null;
}
// trying to find the document.
if (collection.find(eq("name", doc.get("name"))).first() == null) {
// if document not found, insert a new one
collection.insertOne(doc);
} else {
// if the document found, replace/update it with the one I have
collection.replaceOne(eq("name", doc.get("name")), doc);
}
return collection;
}
关于我的错误解决方案的发现
collection.find(eq("name", doc.get("name"))).first()
从不 returns null.
- Java 只告诉我它 returns 是一个对象。 MongoDB Documentation 告诉我它是一个
TResult
,指向 MongoIterable<TResult>
。我被困在这里了。
- 代码结果是 none 个文档最后是 inserted/updated。
参考
collection.find()
return 一个文档数组。你真正想要的是 collection.findOneAndUpdate()
从 findOneAndUpdate
获得 TDoucment
对象后,您可以使用 ObjectMapper 例如 jackson 将其映射回 java 对象
我尝试了一些代码,效果很好。这与您的代码没有太大区别。
从 mongo shell:
创建了一个文档
MongoDB Enterprise > db.users.findOne()
{
"_id" : "5de6af7cfa42833bd9849477",
"name" : "Richard Koba",
"skills" : [ ]
}
我的Java代码:
// Test input documents
private Document doc1 = new Document()
.append("name", "Richard Koba")
.append("skills", Arrays.asList("jump", "dance", "sing"));
private Document doc2 = new Document()
.append("name", "Richard K")
.append("skills", Arrays.asList("sings"));
当 doc1
传递给以下方法时,结果为:“### Doc FOUND”。并且,doc2
结果是“### Doc NOT found”。
private void checkDocument(Document doc) {
MongoClient mongoClient = MongoClients.create("mongodb://localhost/");
MongoDatabase database = mongoClient.getDatabase("javadb");
MongoCollection<Document> collection = database.getCollection("users");
if (collection.find(eq("name", doc.get("name"))).first() == null) {
System.out.println("### Doc NOT found");
}
else {
System.out.println("### Doc FOUND");
}
}
这个我也试过了,结果一样。
Document d = collection.find(eq("name", doc.get("name"))).first();
if (d == null) { // ... }
这个我也试过了;也很好用。
if (collection.find(queryFilter).iterator().tryNext() == null) { // ... }
我认为您的代码或数据库/集合可能存在其他问题。使用新数据进行一些调试和测试可能会揭示真正的问题。
- 你检查文档是否已经存在于集合中,来自 mongo shell 或 Compass工具?
- 您使用的数据库和集合名称是否正确?
- 每次测试后 运行 如果更新/插入,您是否验证数据库中的数据?
collection.find(eq("name", doc.get("name"))).first() never returns
null.
使用我上面发布的代码,当 users
集合为空时,查找查询执行 return null
。
谢谢
- 我只是想感谢您点击这个问题!我已尽最大努力使它尽可能彻底。
- 但是,如果您需要进一步澄清,请随时告诉我!
- 如果您觉得问题太长。您可以在此处阅读第三部分和第四部分,然后 post 您自己的解决方案!
设置
- Mongodb Java 驱动程序:org.mongodb:mongo-java-驱动程序:3.11.0-rc0
我想做什么
- 查找具有特定“名称”字段的特定文档。
- 然后更新其他字段或整个文档。
示例文档
// the document that I am trying to find in db
{
"_id":"5de6af7cfa42833bd9849477",
"name":"Richard Koba",
"skills":[]
}
// the document that I have
{
"name":"Richard Koba",
"skills":[jump, dance, sing]
}
// final result in db
{
"_id":"5de6af7cfa42833bd9849477",
"name":"Richard Koba",
"skills":[jump, dance, sing]
}
我现在在做什么
// finding a document with same "name" field as input doc and update it with doc
public MongoCollection updateDocument(Document doc, String colName) {
MongoCollection collection;
// make sure collection exist
try {
collection = connectCollection(colName); // returns MongoCollection Obj
} catch (CollectionNotFoundException e) {
MessageHandler.errorMessage(e.getMessage());
return null;
}
// trying to find the document.
if (collection.find(eq("name", doc.get("name"))).first() == null) {
// if document not found, insert a new one
collection.insertOne(doc);
} else {
// if the document found, replace/update it with the one I have
collection.replaceOne(eq("name", doc.get("name")), doc);
}
return collection;
}
关于我的错误解决方案的发现
collection.find(eq("name", doc.get("name"))).first()
从不 returns null.- Java 只告诉我它 returns 是一个对象。 MongoDB Documentation 告诉我它是一个
TResult
,指向MongoIterable<TResult>
。我被困在这里了。 - 代码结果是 none 个文档最后是 inserted/updated。
参考
collection.find()
return 一个文档数组。你真正想要的是collection.findOneAndUpdate()
从
findOneAndUpdate
获得TDoucment
对象后,您可以使用 ObjectMapper 例如 jackson 将其映射回 java 对象
我尝试了一些代码,效果很好。这与您的代码没有太大区别。
从 mongo shell:
创建了一个文档MongoDB Enterprise > db.users.findOne()
{
"_id" : "5de6af7cfa42833bd9849477",
"name" : "Richard Koba",
"skills" : [ ]
}
我的Java代码:
// Test input documents
private Document doc1 = new Document()
.append("name", "Richard Koba")
.append("skills", Arrays.asList("jump", "dance", "sing"));
private Document doc2 = new Document()
.append("name", "Richard K")
.append("skills", Arrays.asList("sings"));
当 doc1
传递给以下方法时,结果为:“### Doc FOUND”。并且,doc2
结果是“### Doc NOT found”。
private void checkDocument(Document doc) {
MongoClient mongoClient = MongoClients.create("mongodb://localhost/");
MongoDatabase database = mongoClient.getDatabase("javadb");
MongoCollection<Document> collection = database.getCollection("users");
if (collection.find(eq("name", doc.get("name"))).first() == null) {
System.out.println("### Doc NOT found");
}
else {
System.out.println("### Doc FOUND");
}
}
这个我也试过了,结果一样。
Document d = collection.find(eq("name", doc.get("name"))).first();
if (d == null) { // ... }
这个我也试过了;也很好用。
if (collection.find(queryFilter).iterator().tryNext() == null) { // ... }
我认为您的代码或数据库/集合可能存在其他问题。使用新数据进行一些调试和测试可能会揭示真正的问题。
- 你检查文档是否已经存在于集合中,来自 mongo shell 或 Compass工具?
- 您使用的数据库和集合名称是否正确?
- 每次测试后 运行 如果更新/插入,您是否验证数据库中的数据?
collection.find(eq("name", doc.get("name"))).first() never returns null.
使用我上面发布的代码,当 users
集合为空时,查找查询执行 return null
。