Mongo: tìm các mục không có một trường nhất định


107

Làm cách nào để tìm kiếm tài liệu trong bộ sưu tập bị thiếu một trường nhất định trong MongoDB?

Câu trả lời:


171

Vâng, có thể sử dụng $ tồn tại :

db.things.find( { a : { $exists : false } } ); // return if a is missing

Khi đúng, $ tồn tại khớp với các tài liệu chứa trường, bao gồm các tài liệu có giá trị trường là null. Nếu sai, truy vấn chỉ trả về các tài liệu không chứa trường.


1
Được cảnh báo, $existcác truy vấn không thể sử dụng chỉ mục (xem mongodb.org/display/DOCS/… ).
Theo

4
@Theo: Bắt đầu từ MongoDB 2.0 $ tồn tại có thể sử dụng các chỉ mục ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich 23/11/11

Tôi đã theo dõi điều này để Mongoid sử dụng trong một phạm vi. Ngoại hình như thế này>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs

50

Nếu bạn không quan tâm đến trường có bị thiếu hay không null(hoặc không bao giờ null) thì bạn có thể sử dụng trường ngắn hơn một chút an toàn hơn:

db.things.find( { a : null } ); // return if a is missing or null

Nó an toàn hơn vì $existssẽ trả về truengay cả khi trường trống, thường không phải là kết quả mong muốn và có thể dẫn đến NPE.


1
Tuy nhiên, ai đó đọc mã có thể hiểu nó là trường phải bằng nullvà không bị thiếu. Đây thực sự là một hành vi không mong đợi, bởi vì bạn sẽ không thể làm điều tương tự đối với 0(cũng là false), vì vậy, nullloại ngoại lệ ở đây. Do đó, cách tốt nhất là sử dụng câu trả lời dễ đọc hơn $exists: false, không mơ hồ. Hãy nhớ rằng, biến thể ngắn hơn một chút của bạn không thực sự ngắn hơn nếu bạn cần có nhận xét đằng sau nó!
Yeti

@Yeti nếu mục tiêu của tôi là để tìm tất cả các đối tượng đang thiếu một giá trị cho trường a, hoặc vì anullhay vì alà mất tích, sau đó $existskhông đủ tốt, vì nó sẽ không bắt các trường hợpa đang có null.
nilskp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.