如何查找字段的类型是否为ObjectId并将此字段转换为MongoDB中的字符串?

时间:2015-11-27 13:00:14

标签: mongodb mongodb-query objectid

我有一个集合,其中有超过300,000条记录。我犯了一个错误,其中一些记录有错误的字段:

MBProgressHUD

但是字段应该是字符串的类型。有些记录有正确的字段:

"ParticipantId" : ObjectId("56578b12aa9c5817303f306f"),

我想要做的是找到记录有错误字段并将其值更改为字符串。谢谢你的帮助。

1 个答案:

答案 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) } }
    );
} )