如何使用mongodb Java驱动程序更新较旧的文档?

时间:2018-08-15 14:15:35

标签: java

我试图实现检查mongoDB中的现有文档,然后我需要使用Java驱动程序3.4更新((不只是旧文档的重复)

我的代码段是:

 // search feed
        Document found = database.getCollection("rss_feed").find(new Document("title", title)
                .append("url", url)
                .append("img", img)
                .append("price", price)).first();
        if (found == null) {
            collection.insertOne(new Document("title", title)
                    .append("url", url)
                    .append("img", img)
                    .append("price", price));
                     mongoClient.close();
        System.out.println("Feed not exists in database. Written.");
        } else {
            System.out.println("Feed exists in database.");
        mongoClient.close();
        }

但是,通过这种方式,我只添加了新文档而没有更新。 (据我所知,很好的是,集群将在溢出“文档大小” 时检查自身并在没有我的情况下删除旧文档)

当我尝试通过添加签入条件更新旧文档时:

  // search feed
        Document found = database.getCollection("rss_feed").find(new Document("title", title)
                .append("url", url)
                .append("img", img)
                .append("price", price)).first();
        if (found == null) {
            collection.insertOne(new Document("title", title)
                    .append("url", url)
                    .append("img", img)
                    .append("price", price));
                     mongoClient.close();
        System.out.println("Feed not exists in database. Written.");
        } else {
            collection.updateOne(eq(found), new Document("title", title)
                    .append("url", url)
                    .append("img", img)
                    .append("price", price));
                    mongoClient.close();
            System.out.println("Feed exists in database. Updated");
        mongoClient.close();
        }

我得到:

WARNING: Unsupported option 'retrywrites' in the connection string

enter image description here


更新

如果我使用else if方法编写count条件来检查文档数:

else if(collection.count() > 36) {
            collection.updateOne(found, new Document("updated title", title)
                    .append("updated url", url)
                    .append("updated img", img)
                    .append("updated price", price));
            System.out.println("Feed completely updated in database.");

然后else if将被跳过:

Feed already exists in database.
Feed already exists in database.
Feed already exists in database.
Feed already exists in database.
Feed already exists in database.

有没有人知道如何写支票文件以更新它们?

2 个答案:

答案 0 :(得分:1)

retryWrites连接参数是根据this在MongoDb 3.6中添加的。正如您自己说的那样,您正在使用3.4版,因此出现了警告。

在代码中的某些地方,您可能有一个类似于以下内容的连接字符串:mongodb://db1.example.net:27017?retryWrites=true。您要么需要升级到> = 3.6的版本,要么从连接字符串中删除retryWrites参数,以消除警告。

答案 1 :(得分:0)

有几种方法可以实现它:

  1. Using capped collection
  

有上限的收藏集会自动删除   收集而无需脚本或显式删除操作。

  1. 使用replaceOne()方法。
  

要替换文档,请将新文档传递给replaceOne方法。

  1. 使用updateOne / updateMany方法。 就我而言,我只需要更新几个字段,所以我这样写:

    collection.updateOne(eq(“ _ id”,user_id),新Document(“ $ set”,新Document(“查看链接”,“开”))));

  

在某些情况下,您可能需要更新文档中的许多字段,因此替换文档可能更有效。