是否可以更改数据类型。例如,我有一个字段'user',它的数据类型是字符串。我需要将它的数据类型更改为ObjectId。
我已经尝试但是收到错误。
> 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
>
答案 0 :(得分:1)
最好的方法是使用批量操作API和.bulkWrite()
:
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处分开。