Om du har en Coupon
Mongoid-modellen då skulle samlingen i MongoDB-skalet vara db.coupons
. Det skulle förklara varför:
db.Coupon.insert(...)
i MongoDB-skalet ger inte det du förväntar dig att hitta i din Rails-kod.
Så långt som Neils kommentar om $exists
kontra explicit nil
checkar går, jag tror att du verkligen vill ha nil
(AKA null
inuti MongoDB) kontroller. Tänk på detta i MongoDB-skalet:
> 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") }
Så vi har en samling med dokument som har n
, har inte n
, har explicit null
värden för n
, och icke-null
värden för n
.
Då kan vi se skillnaden mellan Mongoid-frågor som :n => nil
:
> db.models.find({ n: null })
{ "_id" : ObjectId("571546e7ce2934dadf37947b"), "n" : null }
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
och :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 }
och :n => { :$exists => false }
:
> db.models.find({ n: { $exists: false } })
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
Så :expires_at => nil
frågor kommer att hitta dokument som inte har en expires_at
samt dokument där expires_at
var uttryckligen inställd på nil
. Båda dessa fall kommer att hända med Mongoid om du inte är noga med att anropa remove_attribute
istället för att tilldela en nil
och båda fallen betyder "inget utgångsdatum".