【问题标题】:MongoDB bulk operator, insert if not existsMongoDB批量运算符,如果不存在则插入
【发布时间】:2016-08-05 23:36:51
【问题描述】:

我正在使用 MongoDB 批量操作来插入文档。

我想做的是插入,只有在没有找到文档的情况下 - 如果找到它我不想更新(即 upsert)。

任何想法如何做到这一点?

但是,即使在这种情况下:

var obj = {
 item: 'test'
}

bulk.find({ item: {$ne : obj.item}}).upsert().updateOne(obj);
bulk.execute();

如果没有找到,这似乎并没有真正插入任何东西。

编辑:

我想更新一下以澄清更多信息。

我正在尝试执行两种操作,使用批量 api,一种是更新,一种是插入。

文档如下所示:

{
  item: 'test',
  categories: [{
     name: 'one',
     attr: 'two'
  }]
}

我想做的是如果找不到项目值,然后插入 obj.但是,如果找到了,那么如果没有找到categories.name,则将$push 类别对象添加到categories 数组中。如果找到文档并且类别存在,则什么也不做。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您想要的是保持相同的更新操作但更改查询。来自documentation

    Bulk.find(<query>).upsert().update(<update>); Bulk.find(<query>).upsert().updateOne(<update>); Bulk.find(<query>).upsert().replaceOne(<replacement>);

    在 upsert 选项设置为 true 的情况下,如果不存在与 Bulk.find() 条件匹配的文档,则更新或替换操作会执行插入。如果匹配的文档确实存在,则更新或替换操作执行指定的更新或替换。

    更改查询以查找满足条件的文档:

    var obj = { item: 'test' };
    
    bulk.find(obj).upsert().updateOne({ $setOnInsert: obj });
    bulk.execute();
    

    在上面,如果匹配的文档确实存在,那么使用 $setOnInsert 的更新不会执行任何操作,因为更新操作不会导致插入,因为找到了与查询匹配的文档.

    【讨论】:

    • 感谢您的回复。我已经更新了我的问题以澄清更多。我已经尝试按照你所说的去做,但我并没有完全做到。非常感谢您的帮助。
    • 为什么地球上有.upsert()?有时我想知道开发人员是如何挑战常识的。直观地说,它不应该是.updateOne({ $setOnInsert: obj }, { upsert: true }) 吗?一切都井井有条,除了总有一件偏离的事情让开发人员的生活变得可怕。
    【解决方案2】:

    你可以这样做:

    db.collection.update(query, update, {upsert: true})
    

    来自official doc的示例:

    db.people.update(
       { name: "Andy" },
       {
          name: "Andy",
          rating: 1,
          score: 1
       },
       { upsert: true }
    )
    

    【讨论】:

      猜你喜欢
      • 2011-02-17
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      相关资源
      最近更新 更多