无法使用 Spring 引导 MongoDb 创建带有 DBRef 的 "empty" MongoDb 文档

Fail to create "empty" MongoDb Documents with DBRef using Spring boot MongoDb

我正在尝试创建一个包含 DBRef 的 MongoDb 文档 我准备了一个示例设置来说明问题,因为现实生活中的示例太长了

我的数据class是:

@Document(value = "person")
class Person(
    var id: String?,
    var name:String?,
    ...
    var mainAddressId: String?,  // Used quickly find the firs address (I'm lazy)
    @DBRef(db = "mydatabase")
    var address: List<Address>?
)

@Document(collection = "address")
class Address(
    @Id var id: String?,
    var addressLabel: String?,
    var number: String?,
    var street: String?,
    var neighborhood: String?,
    var locality: String?, // City / Town / Village
    var region: String?, // Region / Province / State
    var country: String?,
    var code: String?, // Zip Code
    var google_place_id: String?,
    var timestamp: Date
)

在 @Component class 中我先播种我的地址 注意:ID 在种子中作为其测试数据!如果我省略 Id MondoDb 为我生成一个新 ID (_id:ObjectId())

...
addressDocument.add(
                Address(
                    id = "5cb2e9424274072ec4bb4199",
                    addressLabel = "Home",
                    number = "1",
                    street = "Microsoft Way",
                    neighborhood = "Redmond",
                    locality = "King County",
                    region = "Washington",
                    country = "United States",
                    code = "98052",
                    google_place_id = "JVQC+QM Redmond, Washington, USA",
                    timestamp = Date()
                )
            )
...

我的应用"build"这个记录通过慢慢收集所有数据 我需要保留第一个仅捕获 name 和此处未显示的其他内容的屏幕,然后我需要创建文档

我的困难是 当我创建 List<Address> = Null 地址文档时没有创建因此我没有像 MongoDb 那样创建 ObjectId不保存 null 值 .. 当 Kotlin 在此行抱怨 kotlin.KotlinNullPointerException: null 时一些崩溃 addressDBRef.add(addressRepository.findById(person.addressId!!).orElse(null))

...
val addressDBRef = ArrayList<Address>()
            addressDBRef.add(addressRepository.findById(person.addressId!!).orElse(null))

            val newPerson = Person(
                id = null,
                name = person.name,
                lastName = person.lastName,
                ...
                addressId = person.addressId,
                address = addressDBRef
            )

甚至

address = listOf(Address(
                    id=null,
                    addressLabel = "edit me please",
                    number = null,
                    street = null,
                    neighborhood = null,
                    locality = null,
                    region = null,
                    country = null,
                    code = null,
                    google_place_id = null,
                    timestamp = Date()
                )),

无效!

我已经尝试 Optional(List<Address>) 来测试 null 事件,但是空记录应该在那里,所以我可以稍后添加内容!

也许我的方法一定不同?

我找到了解决方案!

我首先在一个字段中使用 "Dummy" 值创建地址记录,在我的例子中我使用了字段 addressLabel = "home"

val addressDocument = Address(
                addressLabel = "Home",
                number = null,
                street = null,
                neighborhood = null,
                locality = null,
                region = null,
                country = null,
                code = null,
                google_place_id = null,
                timestamp = Date()
            )

            val newAddress = addressRepository.insert(addressDocument)

这成功创建了一个包含新 ObjectId 的文档 然后我将其插入个人文档


            val newPerson = Person(
                id = null,
                name = person.name,
                lastName = person.lastName,
                ...
                addressId = newAddress.id,
                address = listOf(newAddress),
            )

这适用于我能做的所有测试!