MongoDB嵌套数组中的幂等性可能吗?

时间:2016-06-01 14:36:13

标签: javascript mongodb rest

我正在编写一个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_notesproduct_id之间添加新的集合username。 这感觉违反了基于文档的数据库的目的。

另一种解决方案:

{
 username: "test01",
 product_notes: {
  "123": { product_id: ObjectID("123"), note: "My comment!" },
  "124": { product_id: ObjectID("124"), note: "My other comment" } }
}

任何比我更有经验的人有什么可以分享的吗?

1 个答案:

答案 0 :(得分:0)

我对您的要求的理解是您希望为用户存储唯一的产品ID(数组)。

您可以在“username”和“username.product_id”上创建复合唯一索引。因此,当在数组中插入相同的产品ID时,您可以在代码中捕获和处理异常,因为您希望服务是幂等的。

在将新元素添加到数组(即product_notes)方面,我使用了Spring数据,您需要通过主键获取文档(即顶级属性 - 示例“_id”),然后添加一个新的元素到数组并更新文档。

在更新现有数组元素中的属性方面: -

  1. 再次,按主键获取文档(即顶级属性 - 例如“_id”)
  2. 通过迭代数组数据找到正确的产品ID出现次数
  3. 将“[]”替换为数组出现次序

    product_notes.[].note