MongoDB java 客户的 WriteConcern 不工作
MongoDB java client's WriteConcern doesn't work
我是使用新手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);
我怎样才能做正确的事?
那是因为 collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED);
生成了一个新的 MongoCollection
对象,它具有您从未使用过的不同写入关注点:
/**
* Create a new MongoCollection instance with a different write concern.
*
* @param writeConcern the new {@link com.mongodb.WriteConcern} for the collection
* @return a new MongoCollection instance with the different 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
构造函数。
我遇到了这个异常,当 MongoDB 中已经存在一个空集合时,我试图错误地创建另一个相同的集合,所以当我删除现有集合然后执行 post API,然后它对我来说很好..
所以最好先删除现有的集合,然后尝试调用任何 CRUD API..
如果有一个 Java 实体带有 Collection ( name="STUDENT" ) ,并且您再次尝试创建一个名为 student 的集合,则会出现此错误
我是使用新手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);
我怎样才能做正确的事?
那是因为 collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED);
生成了一个新的 MongoCollection
对象,它具有您从未使用过的不同写入关注点:
/** * Create a new MongoCollection instance with a different write concern. * * @param writeConcern the new {@link com.mongodb.WriteConcern} for the collection * @return a new MongoCollection instance with the different 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
构造函数。
我遇到了这个异常,当 MongoDB 中已经存在一个空集合时,我试图错误地创建另一个相同的集合,所以当我删除现有集合然后执行 post API,然后它对我来说很好.. 所以最好先删除现有的集合,然后尝试调用任何 CRUD API.. 如果有一个 Java 实体带有 Collection ( name="STUDENT" ) ,并且您再次尝试创建一个名为 student 的集合,则会出现此错误