2014-05-10 22 views
5

Tôi có bộ sưu tập nơi một số đối tượng có khóa foo. Bây giờ tôi cố gắng truy vấn cho tất cả các đối tượng thực sự có khóa này nhưng không phải với giá trị cụ thể bar. Đối với điều này tôi sử dụng truy vấn sau đây:MongoDB/PyMongo: Truy vấn nhiều tiêu chí - kết quả không mong muốn

collection.find({'foo': {'$exists': True}, 'foo': {'$ne': 'bar'}}) 

Tôi nghĩ rằng cả hai tiêu chí được kết nối thông qua một logic AND. Tuy nhiên, tôi cũng nhận được các đối tượng không có khóa foo. Trong thực tế, tôi nhận được kết quả tương tự khi tôi chỉ sử dụng các truy vấn

collection.find({'foo': {'$ne': 'bar'}}) 

Trên hans khác, nếu tôi sử dụng

collection.find({'foo': {'$exists': True}}) 

tôi một cách chính xác chỉ có được đối tượng với foo nhưng obvisouly tất cả trong số họ, vì vậy một số người trong số họ có giá trị bar.

Làm cách nào để xây dựng truy vấn của mình để đạt được kết quả ban đầu? Có một loại thứ tự mà trong đó nhiều tiêu chí được kiểm tra? Tôi có chỉ định rõ ràng logic AND của cả hai tiêu chí không?

+0

Đây là một ví dụ tuyệt vời của một truy vấn pymongo cơ bản. Tôi ước nó xuất hiện sớm hơn khi tôi googled "pymongo tìm các ví dụ": - \. +1 –

+0

Tôi không nghĩ rằng cần có các ví dụ cụ thể cho PyMongo vì cú pháp cơ bản giống như khi sử dụng trình bao Mongo. Tôi _think_ vỏ Mongo là một chút hào phóng hơn khi nói đến việc có dấu ngoặc kép xung quanh từ khóa và tên trường (ví dụ: '{$ ne: 'bar'}' sẽ hoạt động cũng như '{'$ ne': 'bar'} '). Có thể viết hoa, ví dụ: 'True' cũng có thể quan trọng. – Christian

Trả lời

7

Bạn có thể sử dụng $and tham gia nhiều điều kiện:

collection.find({"$and": [{"foo": {'$ne': 'bar'}}, 
          {"foo": {'$exists': True}}]}) 
+0

Hoàn hảo, cảm ơn! Tôi chỉ nghĩ rằng nếu bạn có một danh sách các tiêu chuẩn, 'AND' là cách ngầm được đưa ra để kiểm tra chúng. Hầu hết các ví dụ tôi tìm thấy chỉ tập trung vào '$ hoặc', do đó có lẽ quan niệm sai lầm của tôi. Nhưng để hỗ trợ các điều kiện phức tạp tùy ý, và '$ và' dĩ nhiên là rất có ý nghĩa. – Christian

7

Không cần phải sử dụng $and, nó cũng làm việc

db.collection.find({"foo":{"$ne":"bar", "$exists":true}}) 
+0

Tuyệt vời, cảm ơn! Vì vậy, tôi đoán tôi có vấn đề này vì cả hai tiêu chí tham khảo cùng một khóa 'foo'. Có sự khác biệt nào về hiệu suất giữa hai giải pháp không? – Christian

+1

Không có sự khác biệt từ quan điểm thực hiện. –

Các vấn đề liên quan