Spring数据mongodb和集合模式设计
朋友,我有一个问题,如何组织和注释我的实体和弹簧数据配置为不同的关系?
我有关系的用户,钱包和余额实体:
- 一对一:用户钱包
- 一对多:钱包余额
我想在MongoDB中有下一个模式:
> db.users.findOne() { _id : ObjectID('UUUU'), name : 'Jason Statham' } > db.wallets.findOne() { _id : ObjectID('WWWW'), user : ObjectID('UUUU') balances : [ { currency: 'USD', balance: 100}, { currency: 'EUR', balance: 530.50 } ] }
- 电子钱包应该包含对ObjectID的引用,并且User被存储在单独的集合中
- 电子钱包应包含作为嵌入实体的余额
实体:
data class User(val id: String, val name: String) data class Wallet(val id: String, val user: User, val balances: List) data class Balance(val currency: String, val balance: BigDecimal)
我的堆栈是:
- 科特林
- 春季启动
- 弹簧引导起动数据的mongodb反应
我的期望是:
- 我可以通过
UserId
声明函数获取Wallet
:fun getWalletByUserId(userId : String): Mono
ReactiveMongoRepository
fun getWalletByUserId(userId : String): Mono
- 在保存实体时,
Id
将被自动分配 -
Wallet
将包含对User
ObjectID
引用 -
Wallet
将包含Balance
嵌入式collections
最后我find解决办法。 这是我的数据类:
@Document data class User( @Indexed val name: String, @Id val id: String? = null ) @Document data class Wallet( @DBRef val user: User, val balances: List, @Id val id: String? = null ) data class Balance(val currency: String, val balance: BigDecimal)
@DBRef
注释保存对用户集合中ObjectId
的引用。 这里是Mongo数据库里的Wallet
实体的一个例子:
> db.wallet.findOne() { "_id" : ObjectId("5a48cd1898318630f692508a"), "user" : DBRef("user", ObjectId("5a48cd1898318630f6925089")), "balances" : [ { "currency" : "USD", "balance" : "100" }, { "currency" : "EUR", "balance" : "200" } ], "_class" : "com.example.model.Wallet" }