【问题标题】:MongoDB setOnInsert and push if already existentMongoDB setOnInsert 并推送(如果已经存在)
【发布时间】:2014-03-15 07:54:00
【问题描述】:

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

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')。

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

【问题讨论】:

    标签: mongodb upsert database


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 甜蜜,我不知道可以将$push 放入不存在的字段中。这解决了我的烦恼。我稍微简化了我的查询,所以我需要坚持$setOnInsert。相反,我将简单地从 $setOnInsert 中删除 visits: { 'en' : ['today'], 'us' : [] }
      猜你喜欢
      • 2020-08-06
      • 2019-05-04
      • 2017-01-10
      • 2020-02-03
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多