es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualizar el campo de matriz anidada para múltiples documentos a la vez.

Tengo un gran número de registros en la colección con la siguiente estructura.

Aquí quiero actualizar todos los campos de “floor” como una cadena vacía “”, donde sea “n/a”. No debe afectar a otros bloques que ya tienen valor para el piso, como el primer o segundo piso.

¿Alguien puede ayudarme con esto?

JSON
{
    “id”: “181”,
    “EID”: “83”,
    “History”: [
        {
            “aNum”: “12324”,
            “dev”: [
                {
                    “type”: “”,
                    “room”: “Oficina”,
                    “floor”: “Segundo Piso”
                },
                {
                    “type”: “”,
                    “room”: “Dormitorio”,
                    “floor”: “n/a”
                },
                {
                    “type”: “”,
                    “room”: “Dormitorio”,
                    “floor”: “Primer Piso”
                },
                {
                    “type”: “”,
                    “room”: “Dormitorio”,
                    “floor”: “n/a”
                }
            ]
        }
    ]
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para actualizar todos los campos de floor como una cadena vacía "" donde se encuentre “n/a”, puedes usar el método update_many() con el operador $set en pymongo. Aquí te dejamos un ejemplo de código:

    from pymongo import MongoClient
    
    cliente = MongoClient()
    colección = cliente.mibasededatos.micolección
    
    # Actualizar todos los "n/a" pisos a ""
    colección.update_many(
        {"Historial.dev.floor": "n/a"},
        {"$set": {"Historial.$[].dev.$[elem].floor": ""}},
        array_filters=[{"elem.floor": "n/a"}]
    )
    

    En el código anterior, primero nos conectamos a nuestra base de datos MongoDB y colección utilizando la clase MongoClient() en pymongo.

    Luego, usamos el método update_many() para actualizar todos los documentos donde el campo dev.floor es “n/a”. El primer argumento de update_many() es el objeto de filtro / consulta que especifica qué documentos actualizar. En este caso, usamos la notación de punto para especificar el campo anidado que queremos consultar (Historial.dev.floor). El segundo argumento es el objeto de actualización que especifica qué cambios hacer en los documentos coincidentes. Aquí, utilizamos el operador $set para establecer el campo floor en una cadena vacía "". También utilizamos dos nuevos operadores $[] y $[elem] para actualizar todos los elementos en los arrays anidados que coinciden con la condición de filtro.

    Finalmente, usamos un parámetro array_filters para establecer la condición para el operador $[elem]. En este caso, queremos actualizar sólo los elementos donde el campo floor es “n/a”.

    Ten en cuenta que este código actualizará todos los documentos coincidentes en la colección. Si quieres probar este código antes de ejecutarlo en tus datos de producción, considera primero ejecutarlo en una base de datos o colección de prueba.

Comments are closed.