MongoDB setOnInsert和push如果已经存在

Mar*_*ius 5 database upsert mongodb

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

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

如果Peter存在,则向其visists.envisists.us数组添加元素.否则,为...创建一个文档Peter.该文档的格式visits应包含当前元素('today').

我的问题是我有"have conflicting mods in update".即(afaik),我不能在一个查询中写两件事.但我怎样才能解决这个难题呢?

Iva*_*Srb 7

您可以在没有$setOnInsert操作员的情

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

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


Far*_*oly 5

您仍然可以使用$setOnInsertbut when$setOnInsert$pushdoes not update 在前面提到的相同字段中。

注意:$addToSet如果您不想在数组中出现重复的值,我们会使用

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