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.

MongoDB – Cómo agregar datos para cada registro

Tengo algunos datos almacenados así:

bson
{
“id” : 1,
“direccionesServidor” : {
“nombre” : “0.0.0.0:8000”,
“nombre2”: “0.0.0.0:8001”
}
}

Necesito los datos agregados de esta manera:

bson
[
{
“id”:”1″,
“nombre”:”nombre1″,
“url”:”0.0.0.0:8000″
},
{
“id”:”1″,
“nombre”:”nombre2″,
“url”:”0.0.0.0:8001″
}
]

¿Cuál es la solución sin usar un bucle?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para convertir los datos almacenados en un formato de datos agregados sin utilizar un bucle ‘for’, podemos hacer uso del Marco de Agregación de MongoDB. Específicamente, podemos utilizar los operadores $objectToArray y $unwind para convertir el objeto anidado serverAddresses en un arreglo y luego separar cada elemento del arreglo en su propio documento. Luego podemos utilizar los operadores $project y $group para remodelar los documentos en el formato deseado.

    Aquí está la solución:

    from pymongo import MongoClient
    
    # Conectar a la instancia de MongoDB
    client = MongoClient('mongodb://localhost:27017/')
    
    # Acceder a la base de datos y colección
    db = client['mydatabase']
    col = db['mycollection']
    
    # Definir la tubería de agregación
    pipeline = [
        {'$project': {
            'gameId': '$_id',
            'serverAddressesArray': {'$objectToArray': '$serverAddresses'}
        }},
        {'$unwind': '$serverAddressesArray'},
        {'$project': {
            '_id': 0,
            'gameId': 1,
            'name': '$serverAddressesArray.k',
            'url': '$serverAddressesArray.v'
        }},
        {'$group': {
            '_id': {'gameId': '$gameId', 'name': '$name'},
            'url': {'$first': '$url'}
        }},
        {'$project': {
            '_id': 0,
            'gameId': '$_id.gameId',
            'name': '$_id.name',
            'url': '$url'
        }}
    ]
    
    # Ejecutar la tubería de agregación y almacenar el resultado en una variable
    result = list(col.aggregate(pipeline))
    
    # Imprimir el resultado
    print(result)
    

    La salida será:

    [
        {'gameId': 1, 'name': 'name2', 'url': '0.0.0.0:8001'}, 
        {'gameId': 1, 'name': 'name', 'url': '0.0.0.0:8000'}
    ]
    

    Ten en cuenta que el orden de los documentos es diferente al formato deseado mostrado en la pregunta, pero esto no debería importar ya que la salida es una lista y se puede ordenar según se desee.

Comments are closed.