我正在编写一个REST api,我想使其成为幂等的。我现在正在努力使用嵌套数组和幂等性。我想在一个原子操作中更新product_notes
数组中的项。这可能在MongoDB中吗?或者我是否必须将数组存储为对象(请参阅本文末尾的示例)?例如,它是否可以模仿upsert
行为但是对于数组?
{
username: "test01",
product_notes: [
{ product_id: ObjectID("123"), note: "My comment!" },
{ product_id: ObjectID("124"), note: "My other comment" } ]
}
如果我想更新现有product_node的注释,我只需使用更新命令和$set
,但如果product_id
尚未在数组中,该怎么办?然后我想做upsert
但是(据我所知)不是嵌入式文档/数组运算符的一部分。
解决此问题并使其具有幂等性的一种方法是在product_notes
和product_id
之间添加新的集合username
。
这感觉违反了基于文档的数据库的目的。
另一种解决方案:
{
username: "test01",
product_notes: {
"123": { product_id: ObjectID("123"), note: "My comment!" },
"124": { product_id: ObjectID("124"), note: "My other comment" } }
}
任何比我更有经验的人有什么可以分享的吗?
答案 0 :(得分:0)
我对您的要求的理解是您希望为用户存储唯一的产品ID(数组)。
您可以在“username”和“username.product_id”上创建复合唯一索引。因此,当在数组中插入相同的产品ID时,您可以在代码中捕获和处理异常,因为您希望服务是幂等的。
在将新元素添加到数组(即product_notes)方面,我使用了Spring数据,您需要通过主键获取文档(即顶级属性 - 示例“_id”),然后添加一个新的元素到数组并更新文档。
在更新现有数组元素中的属性方面: -
将“[]”替换为数组出现次序
product_notes.[].note