MongoDB java客户端的WriteConcern不起作用

时间:2016-03-21 09:50:02

标签: mongodb mongodb-java

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

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

然后我编写了一个非常简单的程序来测试插入操作。

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

我怎样才能做正确的事?

2 个答案:

答案 0 :(得分:3)

那是因为collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED);生成了一个新的MongoCollection对象,它有一个你从不使用的写入问题:

  
    

/ **          *创建一个具有不同写入问题的新MongoCollection实例。          *          * @param writeConcern为集合的新{@link com.mongodb.WriteConcern}          * @return一个具有不同writeConcern的新MongoCollection实例          * /

         

MongoCollection withWriteConcern(WriteConcern writeConcern);

  

以下代码:

MongoCollection<Document> dup = collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED);
...
dup.insertOne(doc);

应该有效,即没有错误。

对于未传播到数据库的MongoClient级别写入问题:

public MongoDatabase getDatabase(final String databaseName) {
    MongoClientOptions clientOptions = getMongoClientOptions();
    return new MongoDatabaseImpl(databaseName, clientOptions.getCodecRegistry(), clientOptions.getReadPreference(),
            clientOptions.getWriteConcern(), createOperationExecutor());
}

正如您所看到的,写入问题取自MongoClientOptions忽略传递给mongoClient.setWriteConcern()方法的参数值,这可能是一个错误。

因此,要正确设置全局写入问题,您必须创建MongoClientOptions的实例:

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

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

答案 1 :(得分:0)

我有这个例外,当在MongoDB中已经存在空集合时,我试图错误地创建一个相同的集合,所以当我删除现有集合然后做了一个后API时,它工作得很好为了我.. 所以最好首先丢弃现有的集合,然后尝试调用任何CRUD API。 如果有一个带有Collection(name =“STUDENT”)的Java实体,并且您再次尝试使用名称student创建一个集合,则会出现此错误