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.

Pymongo $match utilizando _ids y project.

Nuevo en Pymongo y estoy tratando de hacer algo similar a esto. Mi consulta es esta:


{
"$addFields": {
"combcolltier": {
"$map": {
"input": "$educations",
"as": "m",
"in": {
"$mergeObjects": [
"$$m",
{
"tier": {
"$reduce": {
"input": "$collegetiers",
"initialValue": "$$m.tier",
"in": {
"$cond": [
{
"$eq": [
"$$this._id",
"$$m.collegeId"
]
},
"$$this.tier",
3
]
}
}
}
}
]
}
}
}
}
}

Y un ejemplo de mi colección es:

“`
‘educations’: [{‘sharedStatus’: 0,
‘id’: ObjectId(‘5e7250c58a4ej4he03250e69’),
},
{‘sharedStatus’: 2,
‘id’: ObjectId(‘5e7250c58a4eu5uu03250e6a’),
‘profileTypeId’: ObjectId(‘5e8gh64f1e9f5261ae56e41’)}]

‘collegetiers’: [{‘id’: ObjectId(‘5e7250c58a4eu5uu03250e6a’),
‘status’: True,
‘image’: ‘masters/college/Birla+Vishwakarma+Mahavidyalaya.png’},
{‘id’: ObjectId(‘5e7250c58a4ej4he03250e69’),
‘status’: True,
‘createdAt’: datetime.datetime(2021, 11, 12, 12, 6, 8, 67000),
‘tier’: 2,
‘updatedAt’: datetime.datetime(2021, 11, 12, 12, 6, 8, 67000)}]

El resultado deseado sería algo que coincida en base a los identificadores y los identificadores de la universidad y devuelva el “tier” o 3. Algo como esto:

‘combined field’: [{‘sharedStatus’: 0,
‘id’: ObjectId(‘5e7250c58a4ej4he03250e69’),
‘tier’: 2
},
{‘sharedStatus’: 2,
‘_id’: ObjectId(‘5e7250c58a4eu5uu03250e6a’),
‘profileTypeId’: ObjectId(‘5e8gh64f1e9f5261ae56e41’),
‘tier’: 3}]

La versión de MongoDB es 4.4.4.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La consulta que proporcionaste utiliza el marco de agregación de MongoDB y agrega un nuevo campo llamado “combcolltier” a cada documento de la colección. El nuevo campo es una matriz de objetos que combina las matrices “educations” y “collegetiers” en función del ID de la universidad que coincida. Si hay una coincidencia, agrega el campo “tier” al documento de la matriz “collegetiers”, de lo contrario, agrega el valor predeterminado de 3.

    Para obtener el resultado deseado, puedes usar el siguiente código:

    from pymongo import MongoClient
    from bson.objectid import ObjectId
    
    # Conéctate a MongoDB
    cliente = MongoClient()
    db = cliente['nombre_de_base_de_datos']
    collection = db['nombre_de_coleccion']
    
    # Define la canalización (pipeline)
    pipeline = [
        {
            "$addFields": {
                "combcolltier": {
                    "$map": {
                        "input": "$educations",
                        "as": "m",
                        "in": {
                            "$mergeObjects": [
                                "$$m",
                                {
                                    "tier": {
                                        "$reduce": {
                                            "input": "$collegetiers",
                                            "initialValue": "$$m.tier",
                                            "in": {
                                                "$cond": [
                                                    {"$eq": ["$$this._id", "$$m.collegeId"]},
                                                    "$$this.tier",
                                                    3
                                                ]
                                            }
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        }
    ]
    
    # Ejecuta la consulta
    resultado = list(collection.aggregate(pipeline))
    
    # Imprime el resultado
    print(resultado)
    

    Aquí estamos utilizando el controlador PyMongo para Python para conectarnos a la base de datos MongoDB y obtener la colección “nombre_de_coleccion”. Estamos definiendo la canalización (pipeline) de manera similar a la consulta que proporcionaste y ejecutándola usando el método aggregate() del objeto de colección. Finalmente, estamos convirtiendo el objeto cursor en una lista e imprimiendo el resultado.

    El resultado tendrá una lista de documentos donde cada documento contendrá el campo original “educations” y el nuevo campo “combcolltier” agregado como una matriz de objetos con el resultado deseado.

Comments are closed.