MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

La méthode fonctionne en développement mais pas en production Rails MongoDB

Si vous avez un Coupon Modèle Mongoid alors la collection dans le shell MongoDB serait db.coupons . Cela expliquerait pourquoi :

db.Coupon.insert(...)

dans le shell MongoDB ne fournit pas ce que vous vous attendez à trouver dans votre code Rails.

En ce qui concerne le commentaire de Neil sur $exists versus explicite nil les chèques vont, je pense que vous voulez vraiment nil (AKA null à l'intérieur de MongoDB) vérifie. Considérez ceci dans le 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") }

Nous avons donc une collection avec des documents qui ont n , n'ont pas n , ont un null explicite valeurs pour n , et non null valeurs pour n .

Ensuite, nous pouvons voir la différence entre les requêtes Mongoid comme :n => nil :

> db.models.find({ n: null })
{ "_id" : ObjectId("571546e7ce2934dadf37947b"), "n" : null }
{ "_id" : ObjectId("571546ecce2934dadf37947c") }

et :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 }

et :n => { :$exists => false } :

> db.models.find({ n: { $exists: false } })
{ "_id" : ObjectId("571546ecce2934dadf37947c") }

Donc le :expires_at => nil les requêtes trouveront les documents qui n'ont pas de expires_at ainsi que les documents où expires_at a été explicitement défini sur nil . Ces deux cas se produiront avec Mongoid à moins que vous ne preniez soin d'appeler remove_attribute au lieu d'attribuer un nil et les deux cas signifient "pas de date d'expiration".