2012-03-14 3 views
20

Đây là cấu trúc dữ liệu của tôi.Kiểm tra chuỗi rỗng trong mongodb và pymongo

[{ 
"name": "David", 
"lastname": "", 
}, 
{ 
"name": "Angela" 
}] 

"họ" đôi khi có mặt và đôi khi không có và đôi khi là "".

Tôi muốn nhận tất cả các hàng có họ không bằng "". Dường như không hiệu quả. Nó trả về cả hai hàng khi họ là "" và khi họ không có mặt. trong ví dụ trên tôi muốn chỉ nhận được nút David.

db.collection.find({"lastname": {"$ne": ""}}) 

Trả lời

57
db.collection.find({"lastname" : {"$exists" : true, "$ne" : ""}}) 

Trong vỏ Mongo (id của bỏ qua để tiết kiệm không gian)

> db.collection.find() 
    { "name" : "Angela" } 
    { "name" : "David", "lastname" : "" } 
    { "name" : "Kyle", "lastname" : "Test" } 
    { "name" : "John", "lastname" : null } 

> db.collection.find({"lastname" : {"$exists" : true, "$ne" : ""}}) 
    { "name" : "Kyle", "lastname" : "Test" } 
    { "name" : "John", "lastname" : null } 

Trong trường hợp bạn cũng muốn lọc ra phù hợp với các giá trị null bạn cần phải điều chỉnh các chỉ tiêu như sau (chúng tôi cũng có thể loại bỏ $ tồn tại dưới dạng "$ ne": null sẽ xử lý việc này)

> db.collection.find({$and:[{"lastname": {"$ne": null}}, {"lastname": {"$ne": ""}}]}) 
    { "name" : "Kyle", "lastname" : "Test" } 
+0

dấu ngoặc kép quanh $ ne là cần thiết cho python. do đó, biểu thức {$ ne: ""} đánh giá là đúng cả khi level2_c là "" và khi nút level2_c không tồn tại để bắt đầu. Vì vậy, tôi phải lọc chúng ra như thế này {"level2_c": {"$ exist": True}, "level1_b.level2_c": {"$ ne": ""}}. điều này hoạt động nhưng trông hơi xấu xí. –

+1

Tôi đã thử nghiệm từ vỏ mongo. Rất vui khi bạn tìm thấy câu trả lời đúng. – Kyle

+0

Cảm ơn. Tôi làm rõ câu hỏi một chút. bạn có thể xem lại nó không là có một câu trả lời tốt hơn này: {"lastname": {"$ exist": True}, "lastname": {"$ ne": ""}}? –

0

Bạn có thể sử dụng truy vấn regex:

db.test.find({ "lastname": /(.|\s)*\S(.|\s)*/ })

regex này phù hợp với chuỗi bắt đầu hoặc kết thúc với 0 hoặc N khoảng trắng (.|\s) và nó phải là một hoặc nhiều phi khoảng trắng \S ở giữa.