Jeśli masz Coupon
Model Mongoid to kolekcja w powłoce MongoDB to db.coupons
. To wyjaśniałoby, dlaczego:
db.Coupon.insert(...)
w powłoce MongoDB nie zapewnia tego, czego oczekujesz w kodzie Railsowym.
Jeśli chodzi o komentarz Neila na temat $exists
kontra jawne nil
sprawdza się, myślę, że naprawdę chcesz nil
(AKA null
wewnątrz MongoDB). Rozważ to w powłoce 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") }
Mamy więc kolekcję z dokumentami, które mają n
, nie masz n
, mają wyraźne null
wartości dla n
i inne niż null
wartości dla n
.
Wtedy możemy zobaczyć różnicę między zapytaniami Mongoid takimi jak :n => nil
:
> db.models.find({ n: null })
{ "_id" : ObjectId("571546e7ce2934dadf37947b"), "n" : null }
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
i :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 }
i :n => { :$exists => false }
:
> db.models.find({ n: { $exists: false } })
{ "_id" : ObjectId("571546ecce2934dadf37947c") }
Więc :expires_at => nil
zapytania znajdą dokumenty, które nie mają expires_at
jak również dokumenty, w których expires_at
został jawnie ustawiony na nil
. Oba te przypadki będą miały miejsce w przypadku Mongoid, chyba że ostrożnie wywołasz remove_attribute
zamiast przypisywania nil
a oba przypadki oznaczają „brak daty wygaśnięcia”.