Jika Anda memiliki Coupon Model mongoid maka koleksi di shell MongoDB akan menjadi db.coupons . Itu akan menjelaskan alasannya:
db.Coupon.insert(...)
di shell MongoDB tidak memberikan apa yang Anda harapkan dalam kode Rails Anda.
Sejauh komentar Neil tentang $exists versus nil yang eksplisit cek berjalan, saya pikir Anda benar-benar ingin nil (AKA null di dalam MongoDB) cek. Pertimbangkan ini di shell 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") }
Jadi kami memiliki koleksi dengan dokumen yang memiliki n , tidak memiliki n , memiliki null explicit eksplisit nilai untuk n , dan non-null nilai untuk n .
Kemudian kita dapat melihat perbedaan antara query Mongoid seperti :n => nil :
> db.models.find({ n: null })
{ "_id" : ObjectId("571546e7ce2934dadf37947b"), "n" : null }
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
dan :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 }
dan :n => { :$exists => false } :
> db.models.find({ n: { $exists: false } })
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
Jadi :expires_at => nil kueri akan menemukan dokumen yang tidak memiliki expires_at serta dokumen di mana expires_at secara eksplisit diatur ke nil . Kedua kasus tersebut akan terjadi dengan Mongoid kecuali jika Anda berhati-hati untuk memanggil remove_attribute alih-alih menetapkan nil dan kedua kasus berarti "tidak ada tanggal kedaluwarsa".