MongoDB setOnInsert and push 如果已经存在



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

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

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

我的问题是我有"have conflicting mods in update".即(afaik),我不能在一个查询中写入两件事。然而,我该如何解决这一困境呢?

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

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

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

您仍然可以使用 $setOnInsert 但是当 $setOnInsert$push 没有在前面提到的相同字段中更新时。

注意:如果您不希望数组中有重复的值,我们会使用$addToSet

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

相关内容

最新更新