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