在MongoDB文档中匹配符合条件的数组元素?

jus*_*key 9 arrays upsert mongodb

根据如何在MongoDB文档中更新匹配条件的数组元素?

我想要插入数组元素,所以如果一个不匹配然后插入它,否则更新它.

我尝试了这个问题的答案,如果数组元素已经存在,它可以正常工作.如果元素不存在,那么它会在数组字段下创建一个子元素"$".

我的Mongo结构如下:

Widget (collection)
--Name
--Properties (array)
  --Name
  --Value
Run Code Online (Sandbox Code Playgroud)

我的应用程序从WebService调用获取Widget Name和Properties列表.我希望迭代提供的属性并在Name已经存在时更新MongoDB中的值,或者如果不存在则将新属性插入Properties数组.

Rem*_*iet 10

如果没有某些应用程序端逻辑,则无法使用单个更新.请注意,upsert作为一项功能与此特定问题无关,除非您想要自动创建新的Widget文档(如果不存在所提供的名称).

您遇到的问题是没有任何功能允许您根据数组元素的存在执行两个不同的更新.您唯一的两个选择是:

  1. 找到该项目,确定相关属性的存在,使用您的新属性或更改属性编译适当的更新并执行它.这带来了重要的缺点,即这不是一种并发安全方法.换句话说,如果两个Web服务尝试同一个,则可能会覆盖彼此的更改.
  2. 使小部件属性成为顶级文档而不是嵌入式.允许您使用upserts来执行您想要的操作.显而易见的缺点是,在架构设计方面,这不是一个非常好的选择.例如,如果您获取小部件,则不会自动获取所有属性.