sql >> Base de Datos >  >> NoSQL >> MongoDB

Incluir campos en mongodb agregado

No incluye el campo porque no solicitó que se devolviera el campo. Lo que te falta aquí es usar $first o un "accumulator" similar para devolver el elemento durante el $group .

Además, si no desea la dirección de correo electrónico vacía, exclúyala dentro de $match etapa de canalización, ya que es lo más eficiente que se puede hacer.

db.collection.aggregate([
    { $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
    { $group:
        {
            _id: { customer:"$customerID"},
            email: { "$first": "$customerEmail" }
        }
    }
]);

Una "tubería" solo devuelve "salida" de etapas como $group o $project que realmente lo pidas. Al igual que la "tubería Unix" | operador, lo único disponible para la "siguiente etapa" es lo que genera.

Esto debería ser evidente simplemente a partir de:

db.collection.aggregate([
    { $match: { branch: "CO" } },   
    { $group:
        {
            _id: { customer:"$customerID"}
        }
    }
]);

O incluso:

db.collection.aggregate([
    { $match: { branch: "CO" } },   
    { $project:
        {
            _id: { customer:"$customerID"}
        }
    }
]);

Que devuelve, por supuesto, solo el _id valor ya que eso es todo lo que pediste.

Solo tiene acceso en cualquier etapa de canalización a los datos que fueron "salidos por la etapa anterior". Dentro de un $group eso significa solo el _id para la clave de agrupación y lo que se haya especificado "explícitamente" usando un "accumulator" válido para cualquier otra propiedad que desee devolver. Cualquier acumulador (que es válido para una "cadena" aquí) funcionará, pero cualquier cosa fuera del _id debe usa un "accumulator" .

Sugiero tomarse el tiempo para ver todos los operadores de agregación y lo que realmente hacen. Hay un ejemplo de uso con cada operador