Chắc chắn nếu tất cả những gì bạn muốn làm là tách
các thực thể từ văn bản của bạn thì bạn chỉ cần thực hiện đối sánh toàn cục và thay thế:
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
db.tests.update({ "_id": doc._id },{ "$set": { "name": doc.name } });
});
Vì vậy, không cần phải viết ra mọi tổ hợp, regex sẽ thay thế rất khớp bằng / g
quyền mua. Cũng có thể sử dụng / m
đối với nhiều dòng là chuỗi "tên" của bạn chứa các ký tự dòng mới. Xem ví dụ cơ bản về regexer
.
Bạn cũng nên sử dụng $ set
để chỉ sửa đổi (các) trường bạn thực sự muốn thay vì .save ()
toàn bộ tài liệu trở lại. Có ít lưu lượng truy cập hơn và ít cơ hội ghi đè các thay đổi có thể đã được thực hiện bởi một quy trình khác kể từ khi tài liệu được đọc.
Lý tưởng nhất là bạn nên sử dụng API hoạt động hàng loạt với MongoDB phiên bản 2.6 trở lên. Điều này cho phép các bản cập nhật thành "hàng loạt", do đó sẽ có ít lưu lượng truy cập hơn giữa máy khách và máy chủ:
var bulk = db.tests.initializeOrderedBulkOp();
var count = 0;
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
bulk.find({ "_id": doc._id })
.updateOne({ "$set": { "name": doc.name } });
count++;
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.tests.initializeOrderedBulkOp();
}
});
if ( count % 1000 != 0 )
bulk.execute();
Đó là những cách chính của bạn để cải thiện điều này. Rất tiếc, không có cách nào để câu lệnh cập nhật MongoDB sử dụng giá trị hiện có như một phần của biểu thức cập nhật theo cách này, vì vậy cách duy nhất là lặp lại, nhưng bạn có thể làm rất nhiều để giảm các thao tác như được hiển thị.