Nếu bạn có Coupon
Mô hình Mongoid thì tập hợp trong MongoDB shell sẽ là db.coupons
. Điều đó sẽ giải thích tại sao:
db.Coupon.insert(...)
trong MongoDB shell không cung cấp những gì bạn muốn tìm thấy trong mã Rails của mình.
Theo như nhận xét của Neil về $exists
so với nil
rõ ràng kiểm tra đi, tôi nghĩ bạn thực sự muốn nil
(AKA null
bên trong MongoDB) kiểm tra. Hãy xem xét điều này trong trình bao MongoDB:
> db.models.insert({ n: 11 })
> db.models.insert({ n: 0 })
> db.models.insert({ n: null })
> db.models.insert({ })
> db.models.find()
{ "_id" : ObjectId("571546e1ce2934dadf379479"), "n" : 11 }
{ "_id" : ObjectId("571546e4ce2934dadf37947a"), "n" : 0 }
{ "_id" : ObjectId("571546e7ce2934dadf37947b"), "n" : null }
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
Vì vậy, chúng tôi có một bộ sưu tập với các tài liệu có n
, không có n
, có null
rõ ràng giá trị cho n
và không phải null
giá trị cho n
.
Sau đó, chúng ta có thể thấy sự khác biệt giữa các truy vấn Mongoid như :n => nil
:
> db.models.find({ n: null })
{ "_id" : ObjectId("571546e7ce2934dadf37947b"), "n" : null }
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
và :n.exists => true
(AKA :n => { :$exists => true }
):
> db.models.find({ n: { $exists: true } })
{ "_id" : ObjectId("571546e1ce2934dadf379479"), "n" : 11 }
{ "_id" : ObjectId("571546e4ce2934dadf37947a"), "n" : 0 }
{ "_id" : ObjectId("571546e7ce2934dadf37947b"), "n" : null }
và :n => { :$exists => false }
:
> db.models.find({ n: { $exists: false } })
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
Vì vậy, :expires_at => nil
các truy vấn sẽ tìm thấy các tài liệu không có expires_at
cũng như các tài liệu có expires_at
được đặt rõ ràng thành nil
. Cả hai trường hợp đó đều sẽ xảy ra với Mongoid trừ khi bạn cẩn thận gọi remove_attribute
thay vì gán nil
và cả hai trường hợp đều có nghĩa là "không có ngày hết hạn".