MongoDB setOnInsert 并推送(如果已经存在)

标签 mongodb upsert database

如果文档不存在,我想添加一个文档,否则将一个元素添加到其中一个子文档中。

db.test.update(
  {
    name : 'Peter'
  },
  $setOnInsert : { 
      name : 'Peter', 
      visits: { 'en' : ['today'], 'us' : [] }
  },
  $push : {
      visits.en : 'today'
  },
  { upsert : true }
)

如果 Peter 存在,则将一个元素添加到其 visists.envisists.us 数组中。否则,为 Peter 创建一个文档。此文档应具有 visits 格式,其中应包含当前元素 ('today')。

我的问题是我有 “更新中有冲突的模组”。 IE。 (afaik),我不能在一个查询中写两件事。然而,我该如何解决这个困境呢?

最佳答案

您可以在没有 $setOnInsert 运算符的情况下实现它。

db.test.update(
  {
    name : 'Peter'
  },
  {
    $push : {
      "visits.en" : 'today'
    }
  },
  { upsert : true }
)

如果 Peter 存在,元素 'today' 将被添加到其 visits.en 数组中。否则,将为 Peter 创建一个带有 visits 对象的文档,该文档将包含数组 en'today' 元素。
而且我认为,发生该错误是因为您在两个操作($setOnInsert$push)中使用了相同的属性(visits)。

关于MongoDB setOnInsert 并推送(如果已经存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805026/

相关文章:

C# MongoDB 驱动程序 : Can I use generic type for BsonId?

node.js - 带数组参数的 Mongoose 查询

sql - 使用 Oracle 和 PL/SQL 插入或更新

java - 如果值不存在则更新的 ElasticSearch 脚本

php - 我应该用 php 检查唯一约束吗?

mysql - SQL:如果子查询中存在或不存在多个值,则返回 true/false

mysql - 仅选择关联行均不具有特定值的顶级行

mongodb - 非管理员用户的 stable/mongodb-replicaset helm 图表身份验证错误

java - 使用 jOOQ 在 PostgreSQL 中进行 UPSERT

java - 吗啡和 gson 混合用于 mongodb