MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Incluir campos no agregado mongodb


Não inclui o campo porque você não solicitou o retorno do campo. O que está faltando aqui é usar $first ou um "acumulador" semelhante para retornar o elemento durante o $group .

Além disso, se você não quiser o endereço de e-mail vazio, exclua-o no $match estágio de pipeline, já que essa é a coisa mais eficiente a se fazer.
db.collection.aggregate([
    { $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
    { $group:
        {
            _id: { customer:"$customerID"},
            email: { "$first": "$customerEmail" }
        }
    }
]);

Um "pipeline" retorna apenas "saída" de estágios como $group ou $project que você realmente pede. Assim como o "tubo Unix" | operador, as únicas coisas disponíveis para o "próximo estágio" são o que você produz.

Isso deve ser evidente simplesmente a partir de:
db.collection.aggregate([
    { $match: { branch: "CO" } },   
    { $group:
        {
            _id: { customer:"$customerID"}
        }
    }
]);

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

Que retorna, é claro, apenas o _id valor, uma vez que isso é tudo que você pediu.

Você só tem acesso em qualquer estágio do pipeline aos dados que foram "saídos pelo estágio anterior". Dentro de um $group isso significa apenas o _id para a chave de agrupamento e o que foi especificado "explicitamente" usando um "acumulador" válido para quaisquer outras propriedades que você deseja devolver. Qualquer acumulador (que é válido para uma "string" aqui) servirá, mas qualquer coisa fora do _id deve use um "acumulador" .

Sugiro reservar um tempo para analisar todos os operadores de agregação e o que eles realmente fazem. Há uso de exemplo com cada operador