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

Cách trả về tài liệu trong đó hai trường có cùng giá trị

Bạn có hai lựa chọn ở đây. Cách đầu tiên là sử dụng $where nhà điều hành.

Collection.find( { $where: "this.start === this.end" } )

Tùy chọn thứ hai là sử dụng khung tổng hợp và $redact nhà điều hành.

Collection.aggregate([
    { "$redact": { 
        "$cond": [
            { "$eq": [ "$start", "$end" ] },
            "$$KEEP",
            "$$PRUNE"
        ]
    }}
])

$where toán tử thực hiện đánh giá JavaScript và không thể tận dụng các chỉ mục, vì vậy hãy truy vấn bằng cách sử dụng $where có thể làm giảm hiệu suất trong ứng dụng của bạn. Xem cân nhắc . Nếu bạn sử dụng $ trong đó mỗi tài liệu của bạn sẽ được chuyển đổi từ BSON sang đối tượng JavaScript trước thao tác $ where, sẽ làm giảm hiệu suất. Tất nhiên truy vấn của bạn có thể được cải thiện nếu bạn có bộ lọc chỉ mục. Ngoài ra, có nguy cơ bảo mật nếu bạn đang tạo truy vấn động dựa trên thông tin người dùng nhập vào.

$redact như $where không sử dụng chỉ mục và thậm chí thực hiện quét bộ sưu tập, nhưng hiệu suất truy vấn của bạn được cải thiện khi bạn $redact bởi vì nó là một toán tử MongoDB tiêu chuẩn. Điều đó được cho là tùy chọn tổng hợp tốt hơn nhiều vì bạn luôn có thể lọc tài liệu của mình bằng cách sử dụng toán tử so khớp $.

$where ở đây là tốt nhưng có thể tránh được. Ngoài ra, tôi tin rằng bạn chỉ cần $where khi bạn gặp vấn đề về thiết kế lược đồ. Ví dụ, thêm một trường boolean khác vào tài liệu có chỉ mục có thể là một lựa chọn tốt ở đây.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:xuất giá trị cột riêng biệt

  2. Sử dụng kết quả từ mongodb trong tập lệnh shell

  3. cappedMax không hoạt động trong trình ghi chép winton-mongodb trong Node.js trên Ubuntu

  4. Làm cách nào để lấy dữ liệu ReferenceField trong mongoengine?

  5. MongoDB:kích thước tài liệu có ảnh hưởng đến hiệu suất truy vấn không?