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

Làm thế nào để truy vấn tài liệu trong mongodb (pymongo) nơi tất cả các từ khóa tồn tại trong một trường?

Cân nhắc sử dụng chỉ mục văn bản với $text tìm kiếm . Nó có thể là một giải pháp tốt hơn nhiều so với việc sử dụng các biểu thức chính quy. Tuy nhiên, tìm kiếm văn bản trả về tài liệu dựa trên thuật toán tính điểm, vì vậy bạn có thể nhận được một số kết quả không có tất cả các từ khóa bạn đang tìm kiếm.

Nếu bạn không thể hoặc không muốn thêm chỉ mục văn bản vào trường này, việc sử dụng một cụm từ thông dụng sẽ khá khó khăn vì bạn không biết thứ tự xuất hiện của những từ này. Tôi không khẳng định là không thể viết được, nhưng bạn sẽ kết thúc với một sự ghê tởm khủng khiếp ngay cả đối với các tiêu chuẩn regex. Sẽ dễ dàng hơn nhiều nếu sử dụng toán tử regex nhiều lần bằng cách sử dụng $and nhà điều hành.

Ngoài ra, sử dụng dấu cách làm dấu phân cách sẽ không thành công khi từ ở đầu hoặc cuối chuỗi hoặc theo sau là dấu chấm hoặc dấu phẩy. Sử dụng mã thông báo ranh giới từ (\b ) thay vào đó.

collection.find(
    { $and : [
              {'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
         ]
    });

Hãy nhớ rằng đây là một truy vấn thực sự chậm, bởi vì nó sẽ chạy ba biểu thức chính quy này trên mọi tài liệu của bộ sưu tập. Khi đây là một truy vấn quan trọng về hiệu suất, hãy nghiêm túc xem xét liệu chỉ mục văn bản có thực sự không. Không thực hiện được, điều cuối cùng cần nắm được là trích xuất bất kỳ từ khóa nào từ documenttextfield trường mà ai đó có thể tìm kiếm (có thể là mọi từ duy nhất trong đó) vào một trường mảng mới documenttextfield_keywords , tạo một chỉ mục bình thường trên trường đó và tìm kiếm trên trường đó bằng $all nhà điều hành (không yêu cầu biểu thức chính quy trong trường hợp đó).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. pullAll trong khi xóa các đối tượng được nhúng

  2. Chuyển đổi DBObject thành Java Object trong khi truy xuất các giá trị từ MongoDB

  3. Thêm trường phần tử mảng trong tập hợp MongoDB

  4. Truyền tới ObjectId không thành công cho giá trị 586cc8b3ea780c071bbe2469 tại đường dẫn _id cho người dùng kiểu mẫu

  5. Mongoose cập nhật / nâng cấp?