2017-06-28 4 views
0

データタイプを変更することは可能ですか?私はフィールド 'user'を持っていて、そのデータ型は文字列です。データ型を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()これが唯一の指定されたフィールドを更新だけでなく、実際には「バッチ」でのコミットのようなメソッドとは対照的にサーバーに送信するので、1回の書き込みごとに前後の通信のオーバーヘッドを取り除いて、1回の書き込みと肯定応答を1回のバッチで行うだけです。 500を使用するのは合理的なサイズですが、基本となるドライバとサーバーは常に1000で分離します。

+0

本当に素晴らしいです!ありがとうございました –

関連する問題