MongoDb Script Timing Out / Not Logging Iteration

时间:2016-02-24 23:06:41

标签: mongodb

我正在运行此脚本:

public static Expression<Func<SubClass,bool>> ConvertExpression(Expression<Func<BaseClass, bool>> baseClassExpression)
{
    Func<SubClass, bool> filterFunction = baseClassExpression.Compile(); // This assignment works because Func parameter types are contravariant.
    Expression<Func<SubClass, bool>> filterExpression = item => filterFunction(item);

    return filterExpression;
}

目标是在&#34;条形码&#34;中添加新字段。数组&#34;条形码&#34;对象。此新字段是现有字段的小写字母。我相信我正在做的一切正确,但我需要更新150万条记录。上次运行一个小时,只更新了30,000个项目。最糟糕的是,它返回了一个&#34;更新了一条记录&#34;条目没有给我一些它更新的记录数量。

有什么方法可以得到这个号码吗?我没有看到在Robomongo中记录每次迭代的方法(打印似乎会影响输出?)。

所以主要问题是,如何记录更新的结果数量?你知道,这种交易:

db.parts.find( { Barcodes: { $exists: true, $ne: null, $not: {$size: 0} } })
    .forEach(function (doc) {
        doc.Barcodes.forEach(function (barcode) {
            barcode.ValueLc = barcode.Value.toLowerCase(); 
        });
        db.parts.save(doc);
    });

次要问题(不是必要的)是我如何防止超时? (我实际上并不希望得到这个部分的答案)

1 个答案:

答案 0 :(得分:1)

请尝试通过Bulk进行操作。首先,通过.mapValueLc字段添加到子文档,然后开始批量操作,并通过bulk.find.update操作更新文档,按_id查找并更新{{1}子文档数组。

Barcodes

结果显示如下。

> var c = db.parts.find(
              {Barcodes: {$exists: true, $ne: null, $not: {$size: 0}}}
          ).map(function(doc){ 
                      doc.Barcodes.forEach(function(barcode){
                               barcode.ValueLc= barcode.Value.toLowerCase();
                      }); 
                      return doc;
      });
> var bulk = db.parts.initializeUnorderedBulkOp();
> c.forEach(function(ret){
              bulk.find({_id: ret._id})
                  .update({$set: {Barcodes: ret.Barcodes}});
      }); 
  bulk.execute();

顺便说一下,bulk.execute()中有一个BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 0, "nUpserted" : 0, "nMatched" : 1, "nModified" : 1, "nRemoved" : 0, "upserted" : [ ] }) ,但 wtimeout 为5000毫秒,这样在写入传播到大多数投票副本后该方法返回设置成员或方法在5秒后超时。