Als u een Coupon
. heeft Mongoid-model, dan is de verzameling in de MongoDB-shell db.coupons
. Dat zou verklaren waarom:
db.Coupon.insert(...)
in de MongoDB-shell biedt niet wat je verwacht te vinden in je Rails-code.
Voor zover Neil's opmerking over $exists
versus expliciete nil
controles gaan, ik denk dat je echt nil
. wilt (ook bekend als null
binnen MongoDB) controles. Overweeg dit in de MongoDB-shell:
> 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") }
We hebben dus een verzameling met documenten die n
. hebben , heb geen n
, hebben expliciete null
waarden voor n
, en niet-null
waarden voor n
.
Dan kunnen we het verschil zien tussen mongoïde zoekopdrachten zoals :n => nil
:
> db.models.find({ n: null })
{ "_id" : ObjectId("571546e7ce2934dadf37947b"), "n" : null }
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
en :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 }
en :n => { :$exists => false }
:
> db.models.find({ n: { $exists: false } })
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
Dus de :expires_at => nil
zoekopdrachten zullen documenten vinden die geen expires_at
. hebben evenals documenten waar expires_at
was expliciet ingesteld op nil
. Beide gevallen zullen gebeuren met Mongoid, tenzij je voorzichtig bent om remove_attribute
aan te roepen in plaats van een nil
toe te wijzen en beide gevallen betekenen "geen vervaldatum".