我正在运行此脚本:
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);
});
次要问题(不是必要的)是我如何防止超时? (我实际上并不希望得到这个部分的答案)
答案 0 :(得分:1)
请尝试通过Bulk
进行操作。首先,通过.map
将ValueLc
字段添加到子文档,然后开始批量操作,并通过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秒后超时。