Không chính xác, và ý tôi là nếu bạn không tìm kiếm "chuỗi chính xác" và muốn luôn thay thế bằng chuỗi khác "giống nhau".
Về cơ bản, có vẻ như bạn đang tìm kiếm "thay thế regex" cho các tài liệu có thể được thực hiện qua .update()
. Mặc dù có thể $regex
tìm kiếm, không có "chụp" hoặc tùy chọn để cung cấp các phần đã chụp vào phần "cập nhật" của một câu lệnh, chẳng hạn như $set
.
Vì vậy, để thực hiện loại cập nhật này, bạn cần lặp lại các tài liệu của mình và sửa đổi trong mã. Nhưng API hoạt động hàng loạt có thể được một số trợ giúp ở đây:
var bulk = db.collection.initializeOrderedBulkOp();
var counter = 0;
var query = { "url": { "$regex": "^http://example\.com" }};
db.collection.find(query).forEach(function(doc) {
// Inspect and replace the part of the string
bulk.find({ "_id": doc._id }).updateOne(
{ "$set": { "url": doc.url.replace("example.com","bucket.aws.com") } }
);
counter++;
// Update once every 1000 documents
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
})
// Process any remaining
if ( counter % 1000 != 0 )
bulk.execute();
Vì vậy, điều đó vẫn yêu cầu lặp lại nhưng ít nhất các bản cập nhật chỉ được gửi đến máy chủ sau mỗi 1000 tài liệu được xử lý.