Как вставить много и обновить дубликаты в mongodb? - PullRequest
1 голос
/ 10 июля 2019

У меня есть много заказов, которые я хотел бы вставить в 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);
    }
}

1 Ответ

1 голос
/ 10 июля 2019

Вы можете найти дубликаты следующим образом, затем вы можете удалить их и вставить их снова.

пример:

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);

}

}

Как вы видите в комментариях к коду, мы сначала получаем дубликаты, а затем удаляем и вставляем строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...