MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tìm và thay thế các chuỗi trong tài liệu một cách hiệu quả

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ị.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Chèn dữ liệu trong MongoDB bằng PHP

  2. Bắt đầu với quản lý người dùng MongoDB

  3. NoClassDefFoundError => ClassPath $ JavaContext khi sử dụng play start

  4. Làm cách nào để lọc tài liệu dựa trên một mảng được nhúng?

  5. Chỉ số duy nhất bị bỏ qua khi cập nhật với Mongoose + Mockgoose trong NodeJS