2016-03-21 83 views
0

我是一个使用MongoDB的新手。我只是通过Maven的进口最新的MongoDB的Java客户端:MongoDB java客户端的WriteConcern不起作用

<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

这是因为collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED);产生与从不使用不同的写入关注新MongoCollection对象:

/** * 创建具有不同的写入关注新MongoCollection实例。 * * @参数writeConcern新的{@link com.mongodb.WriteConcern}为集合 返回:一个新的MongoCollection实例与不同writeConcern */

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

你没有正确阅读所有的代码。在所有'mongoClient.setWriteConcern(WriteConcern.UNACKNOWLEDGED)'之前也有这条线路。所以他们期待着“全球效应”。关于收集的设置只是一个后果问题。 –

+0

@BlakesSeven编辑的回复 –

+0

把'.withWriteConcern(WriteConcern.UNACKNOWLEDGED)'添加到'.getDatabase()'或'.getCollection()'的末尾可能会更简单直接。应该使用。一般来说'UNACKNOWLEDGED'非常“强力”,只有当你真的知道你在做什么时才应该使用它。当然不是“只是”跳过重复的错误,因为有更好的,“更安全”的方法,以及更少的侵入性方法。请记住OP显然不是这里的专家。 –

0

我有这个异常,当在MongoDB中已经存在空集合时,我试图错误地创建一个更多的集合,所以当我删除现有的集合,然后做了一个后期API,然后它工作对我来说很好.. 所以最好首先删除你现有的集合,然后尝试调用任何CRUD API .. 如果有一个带有Collection的Java实体(name =“STUDENT”),并且您又试图创建一个集合名称的学生,这个错误来了

+1

这看起来更像是一条评论。 – Sunil