无法使用 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),
)
这适用于我能做的所有测试!
我正在尝试创建一个包含 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),
)
这适用于我能做的所有测试!