我有一个集合,其中有超过300,000条记录。我犯了一个错误,其中一些记录有错误的字段:
MBProgressHUD
但是字段应该是字符串的类型。有些记录有正确的字段:
"ParticipantId" : ObjectId("56578b12aa9c5817303f306f"),
我想要做的是找到记录有错误字段并将其值更改为字符串。谢谢你的帮助。
答案 0 :(得分:1)
您需要使用$type
运算符查找“ParticipantId”类型为ObjectId
的文档,并使用"bulk"操作和.str
属性更新这些文档。
var bulk = db.collection.initializeOrderedBulkOp();
var count = 0;
db.collection.find({'ParticipantId': { '$type': 7 } } ).forEach(function(doc) {
bulk.find({ '_id': doc._id }).updateOne({
'$set': { 'ParticipantId': doc.ParticipantId.str }
});
count++;
if (count % 100 === 0) {
// Execute per 100 operations and re-init
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
})
// Clean up queues
if (count > 0) bulk.execute();
您可能还想将“ParticipantId”更改为ObjectId
,其中“ParticipantId”是字符串。
db.collection.find( { 'ParticipantId': { '$type': 2 }}).forEach(function(doc) {
bulk.find( { '_id': doc._id } ).updateOne( {
'$set': { 'ParticipantId': ObjectId(doc.ParticipantId) }
});
count++;
if ( count % 100 === 0 ) {
// Execute per 100 operations and re-init
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
})
// Clean up queues
if ( count > 0 ) bulk.execute();
在早于2.6的版本中,您需要迭代光标和.update()
文档。
db.collection.find( { 'ParticipantId': { '$type': 7 } } ).forEach(function(doc) {
db.collection.update(
{ '_id': doc._id },
{ '$set': { 'ParticipantId': ObjectId(doc.ParticipantId) } }
);
} )