尝试使用 MongoDB Java 驱动程序更新文档

Trying to update a document using MongoDB Java Driver

谢谢

设置

我想做什么

示例文档

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

关于我的错误解决方案的发现

  1. collection.find(eq("name", doc.get("name"))).first() 从不 returns null.
  2. Java 只告诉我它 returns 是一个对象。 MongoDB Documentation 告诉我它是一个 TResult,指向 MongoIterable<TResult>。我被困在这里了。
  3. 代码结果是 none 个文档最后是 inserted/updated。

参考

  1. collection.find() return 一个文档数组。你真正想要的是 collection.findOneAndUpdate()

  2. 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 shellCompass工具?
  • 您使用的数据库和集合名称是否正确?
  • 每次测试后 运行 如果更新/插入,您是否验证数据库中的数据?



collection.find(eq("name", doc.get("name"))).first() never returns null.

使用我上面发布的代码,当 users 集合为空时,查找查询执行 return null