我正试着批量写一些更新,除了upsert之外的所有东西都在工作。
我的代码完美地更新了所有的条目,没有任何错误。
这里的问题是,updateOne的大容量插入没有加插。
(这是我的代码的一个未经测试和缩短的示例,因此您可能会发现一些语法错误。希望你能明白。)

async function insert(items) {
    const ops = items.map(item => ({
        updateOne: {
            filter: {
                id: item.id,
                country: item.country,
            },
            update: { $set: item },
            upsert: true
        }
    }));

    return await db.collection.bulkWrite(ops);
}

insert([{
    id: '123',
    country: 'uk',
    email: '[email protected]'
}]);

上面的代码片段不会重新插入缺少的项,但会正确更新其他所有项。
我使用的是node version 6.6.0mongodb version v3.4.10,因此MongoDB的3.4文档(https://docs.mongodb.com/v3.4/reference/method/db.collection.bulkWrite/)的BulkWrite是3.2版的新版本。
此片段来自于bulkWrite的MongoDB 3.4文档。
db.collection.bulkWrite( [
   { updateOne :
      {
         "filter" : <document>,
         "update" : <document>,
         "upsert" : <boolean>
      }
   }
] )

这是同一文档中的一个例子。
{
    updateOne: {
        "filter": { "char": "Eldon" },
        "update": { $set: { "status": "Critical Injury" } }
    }
}

我在mongo终端接口中直接尝试了一个普通的更新,使用完全相同的数据,并正确地向上插入了该项。
db.collection.update({ id: '123', country: 'uk' }, { $set: { id: '123', country: 'uk', email: '[email protected]' } }, { upsert: true });

最佳答案

const ops = items.map(item =>
           ({ updateOne: {
              filter: { id: item.id, country: item.country},
              update: { $set: {item} }, upsert: true }
           }));

$set by语法要求{id:item.id,country:item.country}而不仅仅是传递id:item.id,country:item.country。

关于node.js - Upsert不适用于updateOne bulkWrite v3.4,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47831967/

10-10 15:21