MongoDB java客户端';s WriteConcern不';行不通

MongoDB java客户端';s WriteConcern不';行不通,mongodb,mongodb-java,Mongodb,Mongodb Java,我是使用MongoDB的新手。我刚刚通过Maven导入了最新的MongoDB java客户端: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.2.2</version> </dependency&

我是使用MongoDB的新手。我刚刚通过Maven导入了最新的MongoDB java客户端:

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.2.2</version>
    </dependency>

org.mongodb
mongo java驱动程序
3.2.2
然后我编写了一个非常简单的程序来测试插入操作

        //I use a replicaset
    MongoClient mongoClient = new MongoClient(
            Arrays.asList(new ServerAddress("10.12.16.136", 29017),
                    new ServerAddress("10.12.16.136", 29018),
                    new ServerAddress("10.12.16.136", 29019)));

    //I just want to write and ignore any database errors. (This does not work)
    mongoClient.setWriteConcern(WriteConcern.UNACKNOWLEDGED);

    //Get database and collection
    MongoDatabase database = mongoClient.getDatabase("test");
    MongoCollection<Document> collection = database.getCollection("realtime");

    //This does not work too.
    collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED);

    //Make a simple object to insert. I already have a document with the same _id in the database and I don't want to see the exception via the WriteConcern operation.
    Document doc = Document("longitude", longitude)
            .append("latitude", latitude)
            .append("velocity", velocity)
            .append("soc", soc)
            .append("_id", 12345678);

    //WriteConcern.UNACKNOWLEDGED doesn't work. An exception will be raised.
    collection.insertOne(doc);
//我使用复制集
MongoClient MongoClient=新的MongoClient(
Arrays.asList(新服务器地址(“10.12.16.136”,29017),
新服务器地址(“10.12.16.136”,29018),
新服务器地址(“10.12.16.136”,29019));
//我只想写入并忽略任何数据库错误。(这不起作用)
mongoClient.setWriteConcern(WriteConcern.UNACKNOWLEDGED);
//获取数据库和集合
MongoDatabase=mongoClient.getDatabase(“测试”);
MongoCollection collection=database.getCollection(“实时”);
//这也不行。
集合。withWriteConcern(WriteConcern.未确认);
//制作一个要插入的简单对象。我在数据库中已经有一个具有相同_id的文档,我不希望通过WriteConcern操作看到异常。
文档文档=文档(“经度”,经度)
.append(“纬度”,纬度)
.append(“速度”,速度)
.附加(“soc”,soc)
.附加(“_id”,12345678);
//WriteConcern.UNACKNOWLEDGED不起作用。将引发异常。
托收。插入通(doc);

如何做正确的事情?

这是因为
collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED)
生成一个新的
MongoCollection
对象,该对象具有一个您从未使用过的不同写入关注点:

/** *创建具有不同写入关注点的新MongoCollection实例。 * *@param writeConcern集合的新{@link com.mongodb.writeConcern} *@返回具有不同writeConcern的新MongoCollection实例 */

MongoCollection with WriteConcern(WriteConcern WriteConcern)

以下代码:

MongoCollection<Document> dup = collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED);
...
dup.insertOne(doc);
如您所见,写入问题来自
mongoclientations
忽略传递给
mongoClient.setWriteConcern()
方法的参数值,这可能是一个错误

因此,要正确设置全局写入关注点,必须创建
mongoclientations
的实例:

 MongoClientOptions options = MongoClientOptions
     .builder()
     .writeConcern(WriteConcern.UNACKNOWLEDGED)
     .build();

并将其传递给
MongoClient
构造函数。

这是因为
collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED)
生成一个新的
MongoCollection
对象,该对象具有一个您从未使用过的不同写入关注点:

/** *创建具有不同写入关注点的新MongoCollection实例。 * *@param writeConcern集合的新{@link com.mongodb.writeConcern} *@返回具有不同writeConcern的新MongoCollection实例 */

MongoCollection with WriteConcern(WriteConcern WriteConcern)

以下代码:

MongoCollection<Document> dup = collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED);
...
dup.insertOne(doc);
如您所见,写入问题来自
mongoclientations
忽略传递给
mongoClient.setWriteConcern()
方法的参数值,这可能是一个错误

因此,要正确设置全局写入关注点,必须创建
mongoclientations
的实例:

 MongoClientOptions options = MongoClientOptions
     .builder()
     .writeConcern(WriteConcern.UNACKNOWLEDGED)
     .build();

然后将其传递给
MongoClient
构造函数。

我遇到了这个异常,当时MongoDB中已经存在on empty集合,我正试图错误地创建一个相同的集合,所以当我删除现有集合并执行post API时,它对我来说运行良好。。 因此,最好先删除现有集合,然后尝试调用任何CRUD API。。
如果有一个Java实体具有集合(name=“STUDENT”),并且您再次尝试创建一个名为STUDENT的集合,则会出现此错误

当MongoDB中已经存在on empty Collection时,我遇到了此异常,并且我错误地尝试创建了另一个相同的集合,因此,当我删除了现有的集合,然后做了一个post API时,它对我来说效果很好。。 因此,最好先删除现有集合,然后尝试调用任何CRUD API。。
如果有一个Java实体具有集合(name=“STUDENT”),并且您再次尝试创建一个名为STUDENT的集合,则会出现此错误

您没有正确读取所有代码。在所有的
mongoClient.setWriteConcern(WriteConcern.UNACKNOWLEDGED)
之前也有这一行。因此,他们期待着“全球效应”。集合上的设置只是一个结果问题。如果只说在
.getDatabase()
.getCollection()
的末尾添加:
.withWriteConcern(WriteConcern.Unackknowledged)
,可能会更简单。一般来说,
未确认
是相当“暴力”的,只有当你真正知道自己在做什么时才应该使用。当然不是“仅仅”跳过重复错误,因为有更好的“更安全”和更少干扰的方法。请记住,OP显然不是这里的专家。您没有正确阅读所有代码。在所有的
mongoClient.setWriteConcern(WriteConcern.UNACKNOWLEDGED)
之前也有这一行。因此,他们期待着“全球效应”。集合上的设置只是一个结果问题。如果只说在
.getDatabase()
.getCollection()
的末尾添加:
.withWriteConcern(WriteConcern.Unackknowledged)
,可能会更简单。一般来说,
未确认
是相当“暴力”的,只有当你真正知道自己在做什么时才应该使用。当然不是“仅仅”跳过重复的错误,因为还有很多错误