node.js - 如何在 mongodb 中 insertMany 和更新重复项?

标签 node.js mongodb mongoose insert insert-update

我有很多订单想要插入到 MongoDB 中,这些订单通过 orderID 进行唯一索引。

如果数据库中存在我的订单之一,我想插入所有订单并更新订单时间。

我尝试使用 updateMany 并将 upsert 设置为 true,但它没有按预期工作。

static async addOrders(ordersArray) {
    const ordersTable = new mongoose.model('ordersTable', Schemas.ordersTable);

    try {
        const docs = await ordersTable.insertMany(ordersArray, {ordered: false});
        return Promise.resolve('Data Inserted');
    } catch (e) {
        return Promise.reject(e);
    }
}

最佳答案

您可以按如下方式找到重复项,然后可以删除它们并重新插入。

示例:

static async addOrders(ordersArray) {
const ordersTable = new mongoose.model('ordersTable', Schemas.ordersTable);

try {
    const docs = await ordersTable.insertMany(ordersArray, {ordered: false});
    return Promise.resolve('Data Inserted');
} catch (e) {
       if (e.code === 11000){
            // 1- getting duplicates
            console.log('getting duplicates');

            let orders = [];
            const ordersIDs = e.result.result.writeErrors.map(error=>{
                const parsedError = JSON.stringify(error);
                const order = JSON.parse(parsedError).op;
                orders.push(order);
                return order.orderID;
            });
            // 2- removing old duplicates.
            const deleted = await ordersTable.deleteMany({orderID:{'$in':ordersIDs}});
            // 3- adding the orders
            try{

                const newAddedOrders = await ordersTable.insertMany(orders , {ordered : false});
                return Promise.resolve('Data Inserted');
            }catch (e) {
                return Promise.reject(e);
            }


        }else return Promise.reject(e);

}

}

正如您在代码注释中看到的,我们首先获取重复项,然后删除和插入行。

关于node.js - 如何在 mongodb 中 insertMany 和更新重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56975629/

相关文章:

Node.js v0.10.18 Mongoose 验证失败于方法 'captureStackTrace' ”

node.js - Mongo 查询(带有位置运算符)在 mongoose 中不起作用

javascript - 如何在不了解 Node/Browserify/npm 等知识的情况下使 Docxtemplater.js 在浏览器上工作?

javascript - 文件从 s3 存储桶写入本地后返回状态

javascript - 如何更改 Mongoose 中文档子数组的对象内的 bool 值?

javascript - meteor 上传清除/重置表单数据

node.js - Nodejs 和微软机器人框架

node.js - Node.js 中的密码哈希

php - 使用 MongoDB 和对象数组进行 Laravel 单元测试

javascript - 从 JSON 格式的 'description' 动态定义 Mongoose 模式