2011-10-23 12 views
9

Estoy tratando de ejecutar la siguiente consulta:MongoDB - Upsert con el incremento

data = { 
    'user_id':1, 
    'text':'Lorem ipsum', 
    '$inc':{'count':1}, 
    '$set':{'updated':datetime.now()}, 
} 
self.db.collection('collection').update({'user_id':1}, data, upsert=True) 

pero las dos consultas '$' hacer que falle. ¿Es posible hacer esto dentro de una declaración?

Respuesta

14

En primer lugar, cuando hace una pregunta como esta, es muy útil agregar información sobre por qué está fallando (por ejemplo, copie el error).

Su consulta falla porque está mezclando $ operadores con anulaciones de documentos. También debe usar el operador $ set para el user_id y los campos de texto (aunque la parte user_id en su actualización es irrelevante en este ejemplo).

Así convertir esto en pymongo consulta:

db.test.update({user_id:1}, 
    {$set:{text:"Lorem ipsum", updated:new Date()}, $inc:{count:1}}, 
    true, 
    false) 

He quitado la user_id en la actualización, ya que no es necesario. Si el documento existe, este valor ya será 1. Si no existe, la inserción copiará la parte de consulta de su actualización en el nuevo documento.