MongoDB insertMany 并跳过重复项

Jax*_*x-p 14 mongodb node.js mongodb-query

我正在尝试将insertMany()项目添加到我的 Mongo 数据库中,但我想跳过重复的 ID。
我正在使用Node.jsmongodb

我有一些数据:

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我们使此插入操作无序,我们将跳过所有传入的重复项并进一步继续,而实际上没有抛出任何错误。

  • 效果很好。谢谢。您写了_进一步进行而没有实际抛出任何错误_。但实际上它仍然会抛出错误。所有重复项都记录在“err.writeErrors”中。正如文档中所写,只是为了澄清:_排除写关注错误,有序操作在错误后停止,而**无序操作继续处理队列中任何剩余的写操作**。_ (2认同)

Yah*_*hya 5

您可以使用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)

运行上面的代码在第一次运行时只会插入两个文档。并且不会在后续运行中给您任何错误。

  • @benone “insertMany()”在无服务器中不起作用是什么意思?你能给个例子吗?我在 [无服务器函数](https://github.com/tik9/fun/blob/main/functions/mongo.js) 中使用 mongo `insert` 和 netlify。 (2认同)