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".