MongoDB Java驱动程序将嵌套对象的id字段转换为_id
MongoDB Java driver converts id field of nested object into _id
我有一个嵌套对象,其中定义了一个 id
字段,在持久化为 mongodb 时转换为 _id
。我试图避免这种情况,因为嵌套对象的 id 字段不是 ObjectId。
这是我拥有的两个简单的 POJO 实体;
Tenant.java
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tenant {
private ObjectId id;
private AppClient appClient;
private Date createdAt;
}
AppClient.java
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class AppClient {
private String id;
private String secret;
private String role;
}
这是我创建租户并坚持使用 mongodb java 驱动程序的示例方式。
public class MainTest {
public static void main(String[] args) {
ConnectionString connString = new ConnectionString("mongodb://127.0.0.1:27017");
CodecRegistry pojoCodecRegistry = fromProviders(PojoCodecProvider.builder().automatic(true).build());
CodecRegistry codecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry);
MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(connString)
.codecRegistry(codecRegistry)
.build();
MongoClient mongoClient = MongoClients.create(settings);
MongoCollection<Tenant> mongoCollection = mongoClient.getDatabase("alpha").getCollection("tenant", Tenant.class);
Tenant tenant = new Tenant();
AppClient appClient = new AppClient();
appClient.setId("12312313");
tenant.setAppClient(appClient);
mongoCollection.insertOne(tenant);
Tenant findResult = mongoCollection.find(new Document().append("appClient.id", "12312313")).first();
}
由于此插入 appClient 具有 _id 字段而不是 id。
{ "_id" : ObjectId("5f4a80b4a0bf93152208e210"), "appClient" : { "_id" : "12312313" } }
这会导致在按 ID 搜索内部文档时出现问题。因此,在上面的示例中,findResult 将为空,因为没有定义任何 id
字段。感谢您的帮助。无论如何谢谢!
刚刚发现 mongodb java 驱动程序将每个以 id
命名的字段默认为 _id
。因此,解决方法是更改 ANNOTATION_CONVENTION
的默认约定类型,如下所示;
PojoCodecProvider.builder().conventions(asList(Conventions.ANNOTATION_CONVENTION)).automatic(true).build();
此外,我们还需要用BsonId注解一个ObjectId的id字段。我们的租户 POJO 看起来像;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tenant {
@BsonId
private ObjectId id;
private AppClient appClient;
private Date createdAt;
}
处进行了解释
我有一个嵌套对象,其中定义了一个 id
字段,在持久化为 mongodb 时转换为 _id
。我试图避免这种情况,因为嵌套对象的 id 字段不是 ObjectId。
这是我拥有的两个简单的 POJO 实体;
Tenant.java
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tenant {
private ObjectId id;
private AppClient appClient;
private Date createdAt;
}
AppClient.java
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class AppClient {
private String id;
private String secret;
private String role;
}
这是我创建租户并坚持使用 mongodb java 驱动程序的示例方式。
public class MainTest {
public static void main(String[] args) {
ConnectionString connString = new ConnectionString("mongodb://127.0.0.1:27017");
CodecRegistry pojoCodecRegistry = fromProviders(PojoCodecProvider.builder().automatic(true).build());
CodecRegistry codecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry);
MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(connString)
.codecRegistry(codecRegistry)
.build();
MongoClient mongoClient = MongoClients.create(settings);
MongoCollection<Tenant> mongoCollection = mongoClient.getDatabase("alpha").getCollection("tenant", Tenant.class);
Tenant tenant = new Tenant();
AppClient appClient = new AppClient();
appClient.setId("12312313");
tenant.setAppClient(appClient);
mongoCollection.insertOne(tenant);
Tenant findResult = mongoCollection.find(new Document().append("appClient.id", "12312313")).first();
}
由于此插入 appClient 具有 _id 字段而不是 id。
{ "_id" : ObjectId("5f4a80b4a0bf93152208e210"), "appClient" : { "_id" : "12312313" } }
这会导致在按 ID 搜索内部文档时出现问题。因此,在上面的示例中,findResult 将为空,因为没有定义任何 id
字段。感谢您的帮助。无论如何谢谢!
刚刚发现 mongodb java 驱动程序将每个以 id
命名的字段默认为 _id
。因此,解决方法是更改 ANNOTATION_CONVENTION
的默认约定类型,如下所示;
PojoCodecProvider.builder().conventions(asList(Conventions.ANNOTATION_CONVENTION)).automatic(true).build();
此外,我们还需要用BsonId注解一个ObjectId的id字段。我们的租户 POJO 看起来像;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tenant {
@BsonId
private ObjectId id;
private AppClient appClient;
private Date createdAt;
}
处进行了解释