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.

La consulta $group de MongoDB está retornando nulo.

Estoy aprendiendo la consulta de MongoDb y mi requerimiento es calcular el tiempo promedio entre dos fechas. Escribí una consulta de mongoDB con etapas de proyecto y grupo.

El resultado que obtengo es:

¿Alguien puede decirme por qué objectId es nulo en este caso pero se imprime el valor en el campo pharmacyName? Estoy usando esta tubería en el servidor de análisis como consulta.aggregate (tubería, {useMasterKey:true})

Mi expectativa es que pharmacyName === objectId.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Es posible que el campo $OrderObject.pharmacy.companyName no esté presente o sea nulo en uno de los documentos que se están procesando, lo que resulta en un valor nulo para el campo objectId en la salida. Por otro lado, el operador $addToSet utilizado en el campo pharmacyName agrega el valor $OrderObject.pharmacy.companyName al conjunto independientemente de si es nulo o no.

    Para verificar esta hipótesis, puede modificar el pipeline y agregar una etapa $match para filtrar documentos donde $OrderObject.pharmacy es nulo o no tiene el campo companyName. Aquí hay un ejemplo:

    {
        $match: {
            "OrderObject.pharmacy.companyName": { $exists: true, $ne: null }
        }
    },
    {
        $project: {
            OrderObject: 1,
            date: 1,
            pharmacyName: "$OrderObject.pharmacy.companyName"
        }
    },
    {
        $group: {
            _id: "$pharmacyName",
            count: { $sum: 1 },
            duration: {
                $avg: {
                    $abs: {
                        $divide: [
                            {
                                $subtract: [
                                    { $arrayElemAt: ["$date", 0] },
                                    { $arrayElemAt: ["$date", 1] }
                                ]
                            },
                            60000
                        ]
                    }
                }
            },
            OrderIDs: { $addToSet: "$OrderObject.orderID" }
        }
    }
    

    En este pipeline modificado, la etapa $match filtra documentos donde $OrderObject.pharmacy es nulo o no tiene el campo companyName. La etapa $project extrae los campos OrderObject y date, y renombra el campo $OrderObject.pharmacy.companyName como pharmacyName. La etapa $group luego agrupa los documentos por el campo pharmacyName, y calcula la duración promedio y otras métricas como antes.

    Tenga en cuenta que en este pipeline modificado, estamos utilizando _id en lugar de objectId como clave de grupo, porque renombramos el campo en la etapa $project. Si desea utilizar objectId como clave de grupo, puede modificar la etapa $group en consecuencia.

Comments are closed.