Bạn vẫn cần phải lặp lại nội dung, nhưng thay vào đó, bạn nên viết lại bằng các thao tác hàng loạt:
Đối với MongoDB 2.6 trở lên:
var bulk = db.collection.initializeUnorderedBulkOp(),
count = 0;
db.collection.find({
"$where": "return !Array.isArray(this.experience)"
}).forEach(function(doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "experience": [doc.experience["0"]] }
});
count++;
// Write once in 1000 entries
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Write the remaining
if ( count % 1000 != 0 )
bulk.execute();
Hoặc trong các phiên bản hiện đại của MongoDB 3.2 trở lên, bulkWrite()
phương pháp được ưu tiên:
var ops = [];
db.collection.find({
"$where": "return !Array.isArray(this.experience)"
}).forEach(function(doc) {
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "experience": [doc.experience["0"]] } }
}
});
if ( ops.length == 1000 ) {
db.collection.bulkWrite(ops,{ "ordered": false })
ops = [];
}
})
if ( ops.length > 0 )
db.collection.bulkWrite(ops,{ "ordered": false });
Vì vậy, khi ghi trở lại cơ sở dữ liệu qua con trỏ, thì các hoạt động ghi hàng loạt với tập hợp "không có thứ tự" là cách nên làm. Nó chỉ có một lần ghi / phản hồi cho mỗi lô 1000 yêu cầu, điều này làm giảm rất nhiều chi phí và "không có thứ tự" có nghĩa là việc ghi có thể xảy ra song song chứ không phải theo thứ tự nối tiếp. Tất cả đều làm cho nó nhanh hơn.