mongodb - 如何配置 MongoRepository 以使用新的 MongoClient API?

标签 mongodb spring-boot spring-data

我的旅程始于我尝试将 MongoDB 的 Java 驱动程序配置为使用 UUID v4 而不是默认设置的 Legacy UUID v3。

我在这里找到了这个解决方案 https://groups.google.com/forum/#!msg/mongodb-user/ZJKQpMpCMU4/dW5ATHTcAvgJ哪个有效。

但正如他所说:

Note that when using the legacy API the codec registry is ignored, so this will not use the overridden UUIDCodec

它不适用于我的 MongoRepositoy

这是我的实际配置:

@Bean
public MongoDbFactory mongoDbFactory() throws Exception {

    ServerAddress server = new ServerAddress(host,port);

    MongoClientOptions.Builder mcoBuilder = MongoClientOptions.builder();
    CodecRegistry codecRegistry = fromRegistries(fromCodecs(new UuidCodec(UuidRepresentation.STANDARD)),
            MongoClient.getDefaultCodecRegistry());
    mcoBuilder.codecRegistry(codecRegistry).build();
    MongoClientOptions options = mcoBuilder.build();

    MongoClient mongoClient = new MongoClient(server,options);

    return new SimpleMongoDbFactory(mongoClient, mongoDataBase);
}

@Bean
public MongoTemplate mongoTemplate() throws Exception {
    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());
    return mongoTemplate;
}

如果我这样做:

mongoClient.getDatabase(mongoDataBase).getCollection("test")
.insertOne(new Document("_id",UUID.randomUUID()));

我明白了:

{ "_id" : BinData(4,"f0u8ig4TS6KaJGK93xmvNw==") }

否则:

mongoTemplate.getCollection("test")
.insert(new BasicDBObject("_id", UUID.randomUUID()));

结果:

{ "_id" : BinData(3,"mUX4PTPBJo6bIjPufHf0vg==") }

我知道 MongoRepository 使用 MongoTemplate,尽管我已将实例设置为使用 MongoClient 而不是旧的 Mongo,仍然无法正常工作。有什么解决办法吗?

最佳答案

MongoClient 扩展了 Mongo,它通过 getDB() 引用了遗留 api DB 类。虽然您已经使用 MongoClient 注册了新的 UUID 编解码器,但只能在您使用 getDatabase() 获取 MongoDatabase 哪个 spring mongo 模板时使用当前版本没有并使用 getDB()。因此,您对注册表的更改永远不会被使用。

Spring MongoDB 2.0.0 版本已更新为使用新的 java 驱动程序 API。因此,您的更改应该可以在 2.0.0 版本中正常工作。

http://docs.spring.io/spring-data/data-mongo/docs/2.0.0.M4/reference/html/

关于mongodb - 如何配置 MongoRepository 以使用新的 MongoClient API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44905341/

相关文章:

regex - 整数值的 MongoDB 正则表达式搜索

node.js - 在 4 个集合之间进行 $Lookup,其中 3 个具有 ObjectId,第 4 个是 String,生成空数组

mysql - JPA - 使用条件 JsonManagedReference 进行查询

spring - 特定 url 的多个身份验证提供程序 - Spring Boot Security

java - 为什么在 Spring Data JPA Repository 上的 save() 之后使用返回的实例?

java - 我可以使用 Spring Framework 分离 JDBC 读取和写入吗?

node.js - Mongoose 连接认证失败

java - Spring Boot - 数据库中不能仅创建一个实体

mongodb - Spring Boot数据如何正确管理NumberLong进行Query?

Node.js(&MongoDB)服务器崩溃,数据库操作中途?