Tengo una mongodb recogida en este formulario:

{id=ObjectId(....),key={dictionary of values}}
where dictionary of values is {'a':'1','b':'2'.....}

Vamos diccionario de valores 'd'.
Necesito actualizar los valores de la clave en el 'd'.
yo.e quiero cambiar 'a':'1' a 'a':'2'
Cómo puede hago en pymongo?

Código va algo como esto:

productData is a collection in mongoDB
for p in productData.find():
     for k,v in p.iteritems():
         value=v['a']
         value=value+1
         v['a']=value

Ahora reflejar el nuevo valor en el productData.

Esto es lo que yo he probado y se introduce un nuevo par clave-valor en lugar de actualizar el

for p in productData.find():
    for k,v in p.iteritems():
         value=v['a']
         value=value+1
         v['a']=value
         productData.update({'_id':mongoId},{"$set":{'d.a':'100'}},upsert=False)
  • Duplicado de stackoverflow.com/questions/4372797/…
  • Hace lo mismo aplica para la actualización de un campo existente?
  • Bastante seguro de que lo hace, sí. Es probar y ver qué pasa.
  • Por una parte se debe hacer «para k,v en p[‘d’].iteritems()» – también, Marque la respuesta más abajo funciona sin la creación de un nuevo par clave/valor. Usted debe publicar más de código para que podamos ver lo que están haciendo mal.
InformationsquelleAutor gizgok | 2012-12-04

4 Comentarios

  1. 101

    Puede utilizar los $sintaxis de set si desea establecer el valor de un documento a un valor arbitrario. Esta bien actualizar el valor si el atributo ya existe en el documento o crearlo si no. Si necesita establecer un único valor de un diccionario como el que usted describe, puede utilizar la notación de punto de acceso de valores del niño.

    Si p es el objeto recuperado:

    existing = p['d']['a']

    Para pymongo versiones < 3.0

    db.ProductData.update({
      '_id': p['_id']
    },{
      '$set': {
        'd.a': existing + 1
      }
    }, upsert=False, multi=False)

    Para pymongo versiones >= 3.0

    db.ProductData.update_one({
      '_id': p['_id']
    },{
      '$set': {
        'd.a': existing + 1
      }
    }, upsert=False)

    Sin embargo, si usted simplemente necesita para incrementar el valor, este enfoque podría presentar problemas cuando varias solicitudes podrían estar ejecutándose al mismo tiempo. En lugar usted debe utilizar los $inc sintaxis:

    Para pymongo versiones < 3.0:

    db.ProductData.update({
      '_id': p['_id']
    },{
      '$inc': {
        'd.a': 1
      }
    }, upsert=False, multi=False)

    Para pymongo versiones >= 3.0:

    db.ProductData.update_one({
      '_id': p['_id']
    },{
      '$inc': {
        'd.a': 1
      }
    }, upsert=False)

    Esto asegura que su incrementos siempre va a pasar.

    • Esto introduce un nuevo par clave-valor
    • Hay falta de } en tanto la actualización de las declaraciones en el $set y $inc parte.
    • Buen lugar @Eleni, he actualizado.
    • $set debe ser citada: '$set'. De lo contrario, se tira error de sintaxis.
  2. 4

    Con mi pymongo versión: 3.2.2 tuve que hacer las siguientes

    from bson.objectid import ObjectId
    import pymongo
    
    client = pymongo.MongoClient("localhost", 27017)
    db = client.mydbname
    
    db.ProductData.update_one({
      '_id': ObjectId(p['_id']['$oid'])
    },{
      '$set': {
        'd.a': existing + 1
      }
    }, upsert=False)
    • enfrentado con Excepción TypeError Valor: Objeto de tipo «ObjectId» no es JSON serializable en django1.11
  3. 0

    Algo que hice hace poco, espero que ayude. Tengo una lista de diccionarios y quería añadir un valor a algunos de los documentos existentes.

    for item in my_list:
        my_collection.update({"_id" : item[key] }, {"$set" : {"New_col_name" :item[value]}})

Dejar respuesta

Please enter your comment!
Please enter your name here