MongoDB Java驱动程序将嵌套对象的id字段转换为_id

MongoDB Java驱动程序将嵌套对象的id字段转换为_id,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我有一个嵌套对象,其中定义了一个id字段,当持久化到mongodb中时,该字段被转换为\u id。我试图避免这种情况,因为嵌套对象的id字段不是ObjectId 这里有两个简单的POJO实体 Tenant.java @Getter @Setter @AllArgsConstructor @NoArgsConstructor public class Tenant { private ObjectId id; private AppClient appClient; pr

我有一个嵌套对象,其中定义了一个
id
字段,当持久化到mongodb中时,该字段被转换为
\u id
。我试图避免这种情况,因为嵌套对象的id字段不是ObjectId

这里有两个简单的POJO实体

Tenant.java

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tenant {

    private ObjectId id;
    private AppClient appClient;
    private Date createdAt;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class AppClient {
    private String id;
    private String secret;
    private String role;
}
AppClient.java

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tenant {

    private ObjectId id;
    private AppClient appClient;
    private Date createdAt;
}
@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();
}

这导致在按id搜索内部文档时出现问题。因此,在上面的示例中,findResult将为null,因为没有定义任何
id
字段。谢谢你的帮助。无论如何谢谢你

刚刚发现mongodb java驱动程序将每个名为
id
的字段默认为
\u id
。因此,解决方法是更改默认约定类型
ANNOTATION\u convention
,如下所示

PojoCodecProvider.builder().conventions(asList(Conventions.ANNOTATION_CONVENTION)).automatic(true).build();
此外,我们必须用BsonId注释id字段,它是一个ObjectId。我们的房客POJO看起来像


@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tenant {
    @BsonId
    private ObjectId id;
    private AppClient appClient;
    private Date createdAt;
}
相关行为的解释见