Pokud máte Coupon
Mongoidní model, pak by kolekce v prostředí MongoDB byla db.coupons
. To by vysvětlovalo proč:
db.Coupon.insert(...)
v shellu MongoDB neposkytuje to, co očekáváte, že najdete v kódu Rails.
Pokud jde o Neilův komentář o $exists
versus explicitní nil
kontroly, myslím, že opravdu chcete nil
(AKA null
uvnitř MongoDB) kontroluje. Zvažte to v prostředí 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") }
Máme tedy kolekci s dokumenty, které mají n
, nemají n
, mají explicitní null
hodnoty pro n
a non-null
hodnoty pro n
.
Pak můžeme vidět rozdíl mezi mongoidními dotazy jako :n => nil
:
> db.models.find({ n: null })
{ "_id" : ObjectId("571546e7ce2934dadf37947b"), "n" : null }
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
a :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 }
a :n => { :$exists => false }
:
> db.models.find({ n: { $exists: false } })
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
Takže :expires_at => nil
dotazy najdou dokumenty, které nemají expires_at
stejně jako dokumenty, kde expires_at
byl explicitně nastaven na nil
. Oba tyto případy nastanou s Mongoidem, pokud nebudete opatrní při volání remove_attribute
místo přiřazení nil
a oba případy znamenají „žádné datum vypršení platnosti“.