MongoDB批量运算符,如果不存在则插入

时间:2016-08-05 23:36:51

标签: mongodb

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

我想做的就是插入,只有在没有找到文件的情况下才会插入 - 如果找不到文件我也不想更新(即,插入)。

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

然而,即使在这种情况下:

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数组。如果找到该文档且该类别存在,则不执行任何操作。

2 个答案:

答案 0 :(得分:8)

您需要的是保持相同的更新操作,但更改查询。来自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 的更新不会做任何事情,因为更新操作不会导致插入,找到匹配的文档查询。

答案 1 :(得分:0)

你可以这样做:

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

来自official doc的示例:

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