Mongodb 如何使用Mongo JS进行批量更新

Mongodb 如何使用Mongo JS进行批量更新,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在尝试根据所有文档中的另一个字段插入一个新字段。目前,我拥有近3.3亿份文档。一个接一个的更新需要很多时间。下面是我的示例代码 var db = connect('127.0.0.1:27017/sampleDatabase'); print('Database connect'); collectionsList = [1 .... 100]; collectionsList.forEach(addNewTimeField); function addNewTimeField(

我正在尝试根据所有文档中的另一个字段插入一个新字段。目前,我拥有近3.3亿份文档。一个接一个的更新需要很多时间。下面是我的示例代码

var db = connect('127.0.0.1:27017/sampleDatabase');
print('Database connect');
 
collectionsList = [1 .... 100];
 
collectionsList.forEach(addNewTimeField);
 
function addNewTimeField(value, index, array){ 
    let collectionName = 'name_' + value;
    db[collectionName].find().forEach(function(doc) {
        db[collectionName].update({_id:doc._id}, {$set:{"ts": new Date(doc.timeStamp)}});   
    });
    db[collectionName].createIndex({ "ts" : 1 }, { expireAfterSeconds: 31622400 }, { "background": true} );
}

是否有一种方法可以使用批量更新同时更新多个记录?提前感谢。

这将是没有“查找”部分的解决方案,并将“多个”设置为true,它将对集合中的每个文档执行更新

var db=connect'127.0.0.1:27017/sampleDatabase'; 打印“数据库连接”; collectionsList=[1..100]; collectionsList.forEachaddNewTimeField; 函数addNewTimeFieldvalue,索引,数组{ 让collectionName='name\'+值; db[collectionName].update{},{$set:{ts:{$toDate:$timeStamp},{multi:true}; db[collectionName].createIndex{ts:1},{expireAfterSeconds:31622400},{background:true}; }
这将是没有find部分且multi设置为true的解决方案,它将对集合中的每个文档执行更新

var db=connect'127.0.0.1:27017/sampleDatabase'; 打印“数据库连接”; collectionsList=[1..100]; collectionsList.forEachaddNewTimeField; 函数addNewTimeFieldvalue,索引,数组{ 让collectionName='name\'+值; db[collectionName].update{},{$set:{ts:{$toDate:$timeStamp},{multi:true}; db[collectionName].createIndex{ts:1},{expireAfterSeconds:31622400},{background:true}; } 您可以从MongoDB v4.2中进行尝试

使用 从MongoDB v4.0将时间戳转换为日期 第二个选项是,这将更新单个事务中的所有记录

async function addNewTimeField(value, index, array){ 
  let collectionName = 'name_' + value;
  let allDocs = await db[collectionName].find({}, { timeStamp: 1 });
  let updateAllDocs = allDocs.map(({ _id, timeStamp }) => ({
    updateOne: {
      filter: { _id: ObjectId(_id) },
      update: { ts: new Date(timeStamp) }
    }
  }));
  db[collectionName].bulkWrite(updateAllDocs);
  db[collectionName].createIndex({ "ts" : 1 }, { expireAfterSeconds: 31622400 }, { "background": true} );
}
bulkWrite查询未经测试就准备好了,如果有任何问题,请告诉我

您可以从MongoDB v4.2中进行尝试

使用 从MongoDB v4.0将时间戳转换为日期 第二个选项是,这将更新单个事务中的所有记录

async function addNewTimeField(value, index, array){ 
  let collectionName = 'name_' + value;
  let allDocs = await db[collectionName].find({}, { timeStamp: 1 });
  let updateAllDocs = allDocs.map(({ _id, timeStamp }) => ({
    updateOne: {
      filter: { _id: ObjectId(_id) },
      update: { ts: new Date(timeStamp) }
    }
  }));
  db[collectionName].bulkWrite(updateAllDocs);
  db[collectionName].createIndex({ "ts" : 1 }, { expireAfterSeconds: 31622400 }, { "background": true} );
}
bulkWrite查询未经测试就准备好了,如果有任何问题,请告诉我


在这种情况下,doc将被取消定义,并在new Datedoc上抛出一个错误。timestamper您是对的,您认为使用美元符号操作符来引用每个文档的时间戳会有帮助吗?这取决于OP使用的MongoJS版本是否支持update或updateMany方法,在这种情况下,doc将被取消定义并且在new Datedoc上抛出一个错误。timestamper您是对的,您认为使用美元符号操作符引用每个文档的时间戳会有帮助吗?这取决于OP使用的MongoJS版本是否支持update或updateMany方法,这些方法在collec上可能没有updateMany或bulkWrite方法你是对的,我只是签入文件,他们支持updateMany方法,但他们没有更新文档,bulkWrite不支持。让我先确认一下。收集对象上可能没有updateMany或bulkWrite方法,只是如果他们使用的版本支持上述APIsyou是对的,我只是签入文件,他们支持updateMany方法,但他们没有更新文档,bulkWrite不支持。让我先确认一下。你使用这个吗?如果是,请提供安装的版本。你使用这个吗?如果是,请ovide安装版本。