对于电子商务平台,我们正在寻找产品索引。默认字段很简单,例如:name_en
,name_de
,name_fr
,description
。但是,价格和库存取决于另一个值:
Product A
(对于webshop 1
)具有price = 1.99
,stock = 10
,并且适合类别1、10和50。Product A
(对于webshop 2
)具有price = 5.99
,stock = 5
以及类别9、90和500。我当时在想嵌套对象,但这是一种选择吗?
- name_en: Product A
- description_en: Product A description
- webshops: [{
- key: webshop_id
value: 1
- key: price
value: 1.99
- key: stock
value: 10
- key: categories
value: [1, 10, 50]
},{
- key: webshop_id
value: 2
- key: price
value: 5.99
- key: stock
value: 5
- key: categories
value: [9, 90, 500]
}
]
这样容易查询吗?我们可以轻松获取带有
webshop.key.webshop_id.value = 1
或webshop.key.categories.value = 500
值的整个文档吗?我的想法是否正确,是否有正确的方向指示?
最佳答案
您可以像以前一样嵌套,但是在单个网上商店中很难更新产品的价格或库存,因为您必须重新索引整个webshops
数组。有多种解决方法,但这令人费解。
除了具有嵌套结构之外,您还可以对Webshop零件进行非规范化,只需在这样的文档中包括price
,stock
和categories
字段即可。
Document 1:
- name_en: Product A
- description_en: Product A description
- webshop_id: 1
- price: 1.99
- stock: 10
- categories: [1, 10, 50]
Document 2:
- name_en: Product A
- description_en: Product A description
- webshop_id: 2
- price: 5.99
- stock: 5
- categories: [9, 90, 500]
然后,在查询中,您可以简单地添加
webshop = 1
或webshop = 2
(或两者)的约束,具体取决于您要查询的网上商店。更新特定商店中产品的价格,库存和类别也更加容易,您所要做的就是更新相应的文档。这意味着您的产品数据(名称,说明等)将在每个网上商店中复制一次,但通常没什么大不了的(在NoSQL世界中很常见),您只需要更新2个文档即可,而不是更新单个文档,但是
_bulk
将帮助那里。至少,当您添加新的网上商店时,您不需要重新索引所有数据(!!!),并且您可以更改价格,在一个网上商店中的库存而不会干扰其他网上商店。