如何使用mongo shell更改字段的数据类型?

时间:2017-06-28 09:33:16

标签: mongodb mongodb-query

是否可以更改数据类型。例如,我有一个字段'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
>

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处分开。