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

dzm*_*dzm 7 mongodb

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

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

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

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

var obj = {
 item: 'test'
}

bulk.find({ item: {$ne : obj.item}}).upsert().updateOne(obj);
bulk.execute();
Run Code Online (Sandbox Code Playgroud)

如果没有找到,这似乎实际上没有插入任何内容.

编辑:

我想更新一下以澄清一点.

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

该文件如下:

{
  item: 'test',
  categories: [{
     name: 'one',
     attr: 'two'
  }]
}
Run Code Online (Sandbox Code Playgroud)

我想做的是如果找不到项目值,则插入obj.但是,如果找到它,那么如果categories.name找不到,则$push将该类别对象添加到categories数组中.如果找到该文档并且该类别存在,则不执行任何操作.

chr*_*dam 10

您需要的是保持相同的更新操作,但更改查询.从文档:

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();
Run Code Online (Sandbox Code Playgroud)

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