2012-02-15 6 views
3

Je veux upsert un document avec le pilote mongo-ruby en utilisant quelque chose comme le suivantes-mongo-ruby-pilote ne crée pas un nouveau document sur upsert quand il y a une coutume _id

id = "#{params[:id]}:#{Time.now.strftime("%y%m%d")}" 
# db.collection('metrics').insert({'_id' => id}) 
db.collection('metrics').update(
    { '_id' => id }, 
    { '$inc' => { "hits" => 1 } }, 
    { 'upsert' => true } 
) 

En ce moment cela ne mettra à jour que les documents existants, et n'en créera pas un s'il n'existe pas déjà. La seule façon d'exécuter les deux actions est de décommenter la commande insert() au-dessus.

Si j'utilise la console mongo et que j'essaie de le faire directement (sans avoir besoin de l'insert()), cela fonctionne comme prévu.

Répondre

10

Vous devez utiliser un symbole au lieu d'une chaîne dans les paramètres. Ce code fonctionne.

db.collection('metrics').update(
    { '_id' => id }, 
    { '$inc' => { "hits" => 1 } }, 
    { :upsert => true } 
) 

En fait, vous pouvez utiliser des symboles partout. Cela fonctionne également:

db.collection(:metrics).update(
    { :_id => id }, 
    { :$inc => { :hits => 1 } }, 
    { :upsert => true } 
) 
Questions connexes