2017-06-28 58 views
0

是否可以更改数据类型。例如我有一个字段'用户',它的数据类型是字符串。我需要将其数据类型更改为ObjectId。如何使用mongo shell更改字段的数据类型?

我试过了,但出现错误。

> db.booking.find().foreach(function (x) { x.user = ObjectId(x.user); db.booking.save(x); }); 
2017-06-28T09:30:35.317+0000 E QUERY [thread1] TypeError: db.booking.find(...).foreach is not a function : 
@(shell):1:1 
> 

回答

1

最好的办法是使用具有.bulkWrite()批量操作API:

var ops = []; 
db.booking.find({},{ "user": 1 }).forEach(doc => { 
    doc.user = new ObjectId(doc.user.valueOf()); 

    ops.push({ 
    "updateOne": { 
     "filter": { "_id": doc._id }, 
     "update": { 
     "$set": { "user": doc.user } 
     } 
    } 
    }); 

    if (ops.length >= 500) { 
    db.booking.bulkWrite(ops); 
    ops = []; 
    } 
}); 

if (ops.length > 0) { 
    db.booking.bulkWrite(ops); 
    ops = []; 
} 

至于反对像.save()方法,这只是更新指定的字段,以及实际上只犯“批次”到服务器,因此您可以在每次写入时消除来回通信的开销,从而每批仅写入一次并确认。使用500是一个合理的大小,但底层驱动程序和服务器将始终在1000分离。

+0

你真的太棒了!谢谢 –

相关问题