MongoDB insertMany BulkWriteError,避免捕获重复键,然后执行功能

时间:2018-11-14 14:07:03

标签: node.js mongodb mongoose

我正在使用cron作业通过以下功能在数据库调用中导入多个项目:

async function importItems(items){
return item_schema.insertMany(items, {ordered: false})
    .then(docs => {
        const n = docs ? docs.length : 0
        docs.map((item) => {
            /* Do something */
        })
        return `New items imported ${n} / ${items.length}`
    })
    .catch(error(500, `Error importing items.`))
}

由于以前可能会导入一些项目,由于重复的键('item_id')总是触发 catch <,我收到了 BulkWriteError / em>。

我的问题是我需要对在 then 函数的 docs 数组中获得的成功导入的n个新项进行“处理”,而忽略捕获

有没有办法做到这一点? 谢谢

1 个答案:

答案 0 :(得分:1)

function importItems(items) {
    return item_schema.find({
            item_id: {
                $in: items.map((item) => item.item_id) // Check if item_id is one of the array values
            }
        })
        .then((documents) => {
            // documents is all the items that already exists
            const newItems = items.filter((item) => !documents.find((doc) => doc.item_id === item.item_id));
            return item_schema.insertMany(newItems, { ordered: false })
                .then((docs) => {
                    const n = docs ? docs.length : 0
                    docs.map((item) => {
                        /* Do something */
                    })
                    return `New items imported ${n} / ${items.length}`
                })
                .catch(error(500, `Error importing items.`));
        })
        .catch(error(500, `Error importing items.`));
}