arrays - 在MongoDB文档中增加匹配条件的数组元素?

标签 arrays mongodb upsert

根据How do I update Array Elements matching criteria in a MongoDB document?

我想向上插入数组元素,所以如果一个不匹配,则将其插入,否则对其进行更新。

我尝试了该问题的答案,如果array元素已经存在,则可以正常工作。如果元素不存在,那么它将在数组字段下创建子元素“$”。

我的Mongo结构如下:

Widget (collection)
--Name
--Properties (array)
  --Name
  --Value

我的应用程序从WebService调用获取窗口小部件名称和属性列表。我希望对提供的Properties进行迭代,如果Name已经存在,则更新MongoDB中的值;如果不存在,则将新的Properties插入Properties数组中。

最佳答案

没有一些应用程序侧逻辑,使用单个更新就不可能实现您所需要的。请注意,将ups作为功能与该特定问题无关,除非您不希望使用提供的名称来自动创建新的Widget文档,除非您希望自动创建新的Widget文档。

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

  • 查找项目,确定相关属性的存在,使用您的new或changes属性编译适当的更新并执行它。这有一个重要的缺点,那就是这不是一种并发安全的方法。换句话说,如果两个Web服务尝试同一操作,则可能会覆盖彼此的更改。
  • 使窗口小部件属性成为顶级文档,而不是嵌入式文档。允许您使用upserts做您想做的事。明显的缺点是,就模式设计而言,这不是一个很好的选择。例如,如果获取一个小部件,您将不会自动获得所有属性。
  • 关于arrays - 在MongoDB文档中增加匹配条件的数组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8871363/

    相关文章:

    mongodb - 如何从文档中的列表中查询,其中 2 个条件必须同时为真

    c++ - mongo upsert 性能 (C++)

    arrays - 访问 matlab 结构体中的多个字段

    PHP PDO 绑定(bind)数组值的正确方法

    c# - C#中的声音数组

    arrays - 如何为数组插入 Angular 上的元素设置动画?

    node.js - toObjectId 用于查找和聚合的字符串数组

    node.js - 对于 Elasticsearch,$in(在 mongodb 中)相当于什么?

    MongoDB:更新文档中的字典

    sql - 使用 'ON CONFLICT DO NOTHING' 插入触发器