2010-10-30 32 views
210
db.mycollection.find(HAS IMAGE URL) 
+31

Câu trả lời ngắn: truy vấn '{lĩnh vực: {$ ne: null}} 'kiểm tra không null http://docs.mongodb.org/manual/reference/operator/query/ne/ – Jaider

Trả lời

-3

truy vấn sẽ được

db.mycollection.find({"IMAGE URL":{"$exists":"true"}}) 

nó sẽ trả lại toàn bộ tài liệu có "URL IMAGE" như một chìa khóa ...........

+8

tính năng này không hoạt động nếu doc ​​['IMAGE URL'] = null – kilianc

+0

@kilianc Điều đó không đúng. $ tồn tại cũng sẽ thu được giá trị null. Xem https://docs.mongodb.org/manual/reference/operator/query/exists/ – dorvak

+0

@dorvak chính xác, đó là lý do tại sao điều đó sẽ không thỏa mãn trường hợp sử dụng trong câu hỏi. – kilianc

525

này sẽ trả về tất cả các tài liệu có khóa gọi là "URL IMAGE", nhưng chúng vẫn có thể có giá trị null.

db.mycollection.find({"IMAGE URL":{$exists:true}}); 

này sẽ trả lại toàn bộ tài liệu với cả một phím gọi là "IMAGE URL" một giá trị khác null.

db.mycollection.find({"IMAGE URL":{$ne:null}}); 

Ngoài ra, theo tài liệu, $ hiện không thể sử dụng chỉ mục, nhưng $ ne có thể.

Chỉnh sửa: Thêm một số ví dụ do quan tâm đến câu trả lời này

Với những chèn:

db.test.insert({"num":1, "check":"check value"}); 
db.test.insert({"num":2, "check":null}); 
db.test.insert({"num":3}); 

này sẽ trả lại toàn bộ ba tài liệu:

db.test.find(); 

này sẽ trả lại chỉ các tài liệu đầu tiên và thứ hai:

db.test.find({"check":{$exists:true}}); 

này sẽ trở lại chỉ là tài liệu đầu tiên:

db.test.find({"check":{$ne:null}}); 

này sẽ trở lại chỉ là tài liệu thứ hai và thứ ba:

db.test.find({"check":null}) 
+5

Đó là câu trả lời đúng! – redice

+9

Theo tài liệu, '$ ne' ** bao gồm các tài liệu không chứa trường **. Điều này đã thay đổi kể từ khi bạn đăng câu trả lời? http://docs.mongodb.org/manual/reference/operator/query/ne/ –

+2

Tôi không tin điều đó đã thay đổi. Khi kiểm tra $ ne, giá trị được kiểm tra trong tất cả các tài liệu, bao gồm cả những tài liệu không chứa trường, nhưng $ ne: null vẫn không khớp với tài liệu không chứa trường vì giá trị của trường vẫn là rỗng, mặc dù trường không tồn tại trong tài liệu đó. –

31

Trong pymongo bạn có thể sử dụng:

db.mycollection.find({"IMAGE URL":{"$ne":None}}); 

Vì pymongo đại diện cho mongo "null" là python "None".

3

Một giải pháp thay thế chưa được đề cập, nhưng có thể là một lựa chọn hiệu quả hơn đối với một số (không hoạt động với mục NULL) là sử dụng sparse index (mục trong chỉ mục chỉ tồn tại khi có gì đó trong trường). Dưới đây là một tập hợp dữ liệu mẫu:

db.foo.find() 
{ "_id" : ObjectId("544540b31b5cf91c4893eb94"), "imageUrl" : "http://example.com/foo.jpg" } 
{ "_id" : ObjectId("544540ba1b5cf91c4893eb95"), "imageUrl" : "http://example.com/bar.jpg" } 
{ "_id" : ObjectId("544540c51b5cf91c4893eb96"), "imageUrl" : "http://example.com/foo.png" } 
{ "_id" : ObjectId("544540c91b5cf91c4893eb97"), "imageUrl" : "http://example.com/bar.png" } 
{ "_id" : ObjectId("544540ed1b5cf91c4893eb98"), "otherField" : 1 } 
{ "_id" : ObjectId("544540f11b5cf91c4893eb99"), "otherField" : 2 } 

Bây giờ, tạo chỉ mục thưa thớt trên sân imageurl:

db.foo.ensureIndex({ "imageUrl": 1 }, { sparse: true }) 
{ 
    "createdCollectionAutomatically" : false, 
    "numIndexesBefore" : 1, 
    "numIndexesAfter" : 2, 
    "ok" : 1 
} 

Bây giờ, luôn luôn có một cơ hội (và đặc biệt với thiết lập một dữ liệu nhỏ như mẫu của tôi) thay vì sử dụng chỉ mục, MongoDB sẽ sử dụng quét bảng, ngay cả đối với truy vấn chỉ mục tiềm năng được bảo hiểm. Khi nó quay ra rằng mang lại cho tôi một cách dễ dàng để minh họa sự khác biệt ở đây:

db.foo.find({}, {_id : 0, imageUrl : 1}) 
{ "imageUrl" : "http://example.com/foo.jpg" } 
{ "imageUrl" : "http://example.com/bar.jpg" } 
{ "imageUrl" : "http://example.com/foo.png" } 
{ "imageUrl" : "http://example.com/bar.png" } 
{ } 
{ } 

OK, vì vậy các tài liệu phụ không có imageUrl đang được trả lại, chỉ có sản phẩm nào, không phải những gì chúng tôi muốn.Chỉ cần xác nhận lý do tại sao, hãy giải thích lý do:

db.foo.find({}, {_id : 0, imageUrl : 1}).explain() 
{ 
    "cursor" : "BasicCursor", 
    "isMultiKey" : false, 
    "n" : 6, 
    "nscannedObjects" : 6, 
    "nscanned" : 6, 
    "nscannedObjectsAllPlans" : 6, 
    "nscannedAllPlans" : 6, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "server" : "localhost:31100", 
    "filterSet" : false 
} 

Vì vậy, có, BasicCursor bằng tính năng quét bảng, nó không sử dụng chỉ mục. Hãy buộc các truy vấn để sử dụng chỉ số thưa thớt của chúng tôi với một hint():

db.foo.find({}, {_id : 0, imageUrl : 1}).hint({imageUrl : 1}) 
{ "imageUrl" : "http://example.com/bar.jpg" } 
{ "imageUrl" : "http://example.com/bar.png" } 
{ "imageUrl" : "http://example.com/foo.jpg" } 
{ "imageUrl" : "http://example.com/foo.png" } 

Và có kết quả, chúng tôi đang tìm kiếm - Các tài liệu chỉ với lĩnh vực dân cư được trả về. Điều này cũng chỉ sử dụng chỉ mục (tức là nó là một truy vấn chỉ mục được bảo hiểm), do đó chỉ có chỉ mục cần có trong bộ nhớ để trả về kết quả.

Đây là trường hợp sử dụng chuyên dụng và không thể sử dụng chung (xem các câu trả lời khác cho các tùy chọn đó). Đặc biệt cần lưu ý rằng khi mọi thứ đứng bạn không thể sử dụng count() theo cách này (ví dụ của tôi nó sẽ trả về 6 không 4), vì vậy hãy chỉ sử dụng khi thích hợp.

+0

trường văn bản luôn là chỉ mục thưa thớt, bạn không phải chỉ định rõ ràng. chỉ 2 xu của tôi. –

11

db.collection_name.find({"filed_name":{$exists:true}});

tìm nạp tài liệu có chứa tên tệp này ngay cả khi nó không có giá trị.

đề xuất của tôi:

db.collection_name.find({"field_name":{$type:2}}) //type:2 == String 

Bạn có thể kiểm tra trên loại thuộc tính cần thiết, nó sẽ trả lại tất cả các tài liệu mà field_name nó truy vấn chứa một giá trị bởi vì bạn đang kiểm tra vào loại đệ của người khác nếu nó là null loại điều kiện không phù hợp nên không có gì sẽ được trả về.

Nb: nếu field_name có một chuỗi rỗng có nghĩa là "", nó sẽ được returned.It là hành vi tương tự cho db.collection_name.find({"filed_name":{$ne:null}});

xác nhận thêm:

Được rồi, vì vậy chúng tôi chưa hoàn thành nhưng chúng ta cần thêm một điều kiện.

db.collection_name. find({ "field_name":{$type:2},$where:"this.field_name.length >0"})

HOẶC

db.collection_name. find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})

tham chiếu cho tất cả các loại: https://docs.mongodb.com/manual/reference/operator/query/type/#op._S_type

1

Chia sẻ cho độc giả trong tương lai.

Truy vấn này làm việc cho chúng tôi (truy vấn thực hiện từ MongoDB compass):

{ 
    "fieldName": { 
    "$nin": [ 
     "", 
     null 
    ] 
    } 
} 
0
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}}) 
Các vấn đề liên quan