Jax*_*x-p 14 mongodb node.js mongodb-query
我正在尝试将insertMany()项目添加到我的 Mongo 数据库中,但我想跳过重复的 ID。
我正在使用Node.js和mongodb。
我有一些数据:
const myExampleData = [
{_id:'someId1', name:'I am example'},
{_id:'someId2', name:'I am second example'}
];
Run Code Online (Sandbox Code Playgroud)
我想像这样插入它们:
dbo.collection(collectionName).insertMany(myExampleData).catch(err=>{
console.error(err);
});
Run Code Online (Sandbox Code Playgroud)
让我们假设它someId1已经存在。我不想覆盖它。我只是想跳过它。在当前情况下它不会插入someId2. 一旦抛出重复异常,它就会停止。
有没有办法插入许多并跳过重复项?
我发现线程MongoDB insert 没有重复,建议使用update()withupsert而不是insert()which 对于一项来说可能很好。但对于很多物品呢?据我所知,updateMany()会用相同的值更新所有过滤的行,但我想插入不同的值。
sri*_*asy 20
检查您的声明:
假设 someId1 已经存在。我不想覆盖它。我只是想跳过它。
所以你只是想跳过重复的文档,因为你的意图不是用最新数据更新重复的文档 - 所以不需要使用.update(),你仍然可以使用.insertMany()ordered通过在查询选项中传入一个标志来执行此操作:
订购:可选。一个布尔值,指定mongod实例是否应执行有序或无序插入。默认为true。
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
ordered: <boolean>
}
)
Run Code Online (Sandbox Code Playgroud)
你的代码:
dbo.collection(collectionName).insertMany(myExampleData, {ordered : false }).catch(err=>{
console.error(err);
})
Run Code Online (Sandbox Code Playgroud)
就好像您正在检查_id哪个将具有默认的唯一索引一样,任何传入的重复项实际上都会引发错误,随着ordered : false我们使此插入操作无序,我们将跳过所有传入的重复项并进一步继续,而实际上没有抛出任何错误。
您可以使用bulkWrite执行该操作并获得类似的结果。例如,在 mongo shell 中:
db.collectionName.bulkWrite(
[
{ updateOne :
{
"filter" : { _id:'someId1'},
"update" : { $set : { name:'I am example'}},
"upsert" : true
}
},
{ updateOne :
{
"filter" : { _id:'someId2' },
"update" : { $set : { name:'I am second example'} },
"upsert" : true
}
},
]
);
Run Code Online (Sandbox Code Playgroud)
运行上面的代码在第一次运行时只会插入两个文档。并且不会在后续运行中给您任何错误。
| 归档时间: |
|
| 查看次数: |
17621 次 |
| 最近记录: |