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 - 您可以从 GridFS(MongoDB 文件系统)流式传输视频吗?

    MySQL "UPSERT"并删除不受影响的行

    arrays - 找出连续数组子序列最大值的更好解决方案

    javascript - 如何将上传的图像添加到对象数组中?

    MongoDB 记录所有查询

    iphone - 来自 SQLite 数据库的核心数据 "Upsert"

    sql - PostgreSQL upsert(INSERT ON CONFLICT DO UPDATE)更新行,即使它不应该更新

    c++ - Cuda 从设备内存创建 3d 纹理和 cudaArray(3d)

    javascript - 为什么函数返回未定义?

    MongoDB——在大型数据集上使用多个单词进行慢速文本搜索查询