在mongodb中,我有一个名为category
sample data的主表,如下所示:
{
"_id" : "63d3e01f43aa4e0ee349f841",
"subCategories" : [
{
"subCategoryId" : NumberLong(1),
"name": "Mobile phones"
},
{
"subCategoryId" : NumberLong(2),
"name": "XYZ Machine"
}
]
}
还有一个表product
,示例数据如下:
{
"_id" : "63d3e13b43aa4e0ee349f842",
"productId" : NumberLong(1),
"name" : "iphone 14",
"category" : DBRef("category", "63d3e01f43aa4e0ee349f841")
}
在添加新产品时,只能从所选类别中选择1个类别和1个子类别。在我的例子中,我使用@DbRef
,我正在努力寻找一种方法,通过这种方法,我只能在产品表中保存1个子类别。现在它指向类别表的整个对象,其中可以有x个子类别。
是否可以使用@DbRef注解来实现这一点,而不更改数据库结构,也不破坏单独的类别表和子类别表之间的类别表记录?
可能是这样的:
{
"_id" : "63d3e13b43aa4e0ee349f842",
"productId" : NumberLong(1),
"name" : "iphone 14",
"category" : DBRef({"category", "63d3e01f43aa4e0ee349f841"},
"subCategoryId", 1)
}
使用MongoDb版本4+和Java spring-data-mongo
1条答案
按热度按时间blmhpbnm1#
我认为不改变模式是不可能实现你所期望的行为的。
DBRef是表示文档的约定,而不是特定的引用类型。
因此DBRef将指向特定的文档,而不是某个子文档数组条目。
这给我们留下了两个选择:
1.更改
category
集合以存储文档,如下所示:遗憾的是,由于不允许更改架构,因此禁止此操作
1.在
product
架构中添加另一个字段以存储子类别ID,并在$lookup
汇总:
Mongo Playground
这也是禁止的,因为它需要向
product
模式中再添加一个字段,但我仍然建议这样做,因为这只涉及对模式的最小更改。