首页 > 解决方案 > MongoDB 插入很多,更新很多

问题描述

我在 node.js 中使用 MongoDB。我正在尝试根据不同的条件更新或插入许多文档;但是,MongoDB 更新(使用 upsert)仅适用于单个文档或具有相同条件的多个文档。目前,我有一个包含我要插入的对象的数组(或者如果存在唯一索引则更新),我正在循环遍历数组并调用 updateOnce; 但是,我相信这种方法对于我将拥有的大量对象不是很有效。有什么更好的方法来实现这一目标?

var mongoUtil = require( './database.js' );
var db = mongoUtil.getDb();
//array of objects to insert:
//NOTE: First + Last name is a unique index
var users = [
  {firstName:"John", lastName:"Doe", points:300},
  {firstName:"Mickey", lastName:"Mouse", points:200}
];

var collection = db.collection( 'points' );

for(var i = 0; i < users.length; i++) {
  //If firstName and lastName already exists, update points. Otherwise insert new object
  collection.updateOne(
    {firstName: users[i].firstName, lastName: users[i].lastName},
    {$set: {points: users[i].points}},
    {upsert: true},
    function(err,docs) {
      if(err)
      console.log(err);
    }
  )
}

标签: node.jsmongodb

解决方案


我使用 .bulkWrite() 解决了这个问题:

var mongoUtil = require( './database.js' );
var db = mongoUtil.getDb();
var collection = db.collection( 'points' );

var users = [
  {firstName:"John", lastName:"Doe", points:300},
  {firstName:"Mickey", lastName:"Mouse", points:200}
];

let userUpdate = users.map(user => ({
    updateOne: {
      filter: {firstName: user.firstName, lastName: user.lastName},
      update: {$set: user},
      upsert: true
    }
  }));
  collection.bulkWrite(userUpdate).catch(e => {
    console.log(e);

  });

推荐阅读