Хобрук: Ваш путь к мастерству в программировании

Включить поля в совокупность mongodb

У меня есть следующая коллекция:

{"orderID" : "30688", "branch" : "CO", "customerID" : "11396783", "customerEmail" : "[email protected]"}
{"orderID" : "30688", "branch" : "CO", "customerID" : "11396783", "customerEmail" : "[email protected]"}
{"orderID" : "30688", "branch" : "CO", "customerID" : "11396783", "customerEmail" : "[email protected]"}
{"orderID" : "89765", "branch" : "CO", "customerID" : "54157526", "customerEmail" : ""}
{"orderID" : "89765", "branch" : "CO", "customerID" : "54157526", "customerEmail" : ""}
{"orderID" : "21546", "branch" : "CO", "customerID" : "20103585", "customerEmail" : "[email protected]"}
{"orderID" : "21546", "branch" : "CO", "customerID" : "20103585", "customerEmail" : "[email protected]"}
{"orderID" : "21546", "branch" : "KA", "customerID" : "89374792", "customerEmail" : "[email protected]"}
{"orderID" : "21794", "branch" : "NY", "customerID" : "78125522", "customerEmail" : ""}

Мне нужно получить все уникальные идентификаторы клиентов в определенной ветке, чей адрес электронной почты клиента не равен нулю. Что я ожидаю от «филиала»: «CO»

{"customerID" : "11396783", "customerEmail" : "[email protected]"}
{"customerID" : "20103585", "customerEmail" : "[email protected]"}

До сих пор я пробовал:

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

но это не приносит поле электронной почты.


Ответы:


1

Он не включает поле, потому что вы не запрашивали возврат поля. Здесь вам не хватает использования $first или аналогичного "накопитель", чтобы вернуть элемент во время < a href="https://docs.mongodb.com/manual/reference/operator/aggregation/group/" rel="nofollow noreferrer">$group.

Кроме того, если вам не нужен пустой адрес электронной почты, исключите его в $match этап конвейера, так как это наиболее эффективный способ.

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

«Конвейер» возвращает «выходные данные» только с таких этапов, как $group или $project, о котором вы на самом деле просите. Как и в случае с оператором "Unix pipe" |, на "следующем этапе" доступно только то, что вы выводите.

Это должно быть видно просто из:

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

Или даже:

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

Который возвращает, конечно, только значение _id, так как это все, что вы просили.

На любом этапе конвейера у вас есть доступ только к тем данным, которые были «выведены на предыдущем этапе». Внутри $group это означает только _id для ключа группировки, и все, что было указано "явно" с использованием действительного "аккумулятор" для любых других свойств, которые вы хотите вернуть. Подойдет любой аккумулятор (который здесь подходит для «строки»), но все, что находится за пределами _id, должно использовать "накопитель".

Я предлагаю уделить время изучению всех операторов агрегирования и того, что они на самом деле сделать. Пример использования с каждым оператором

15.05.2018
Новые материалы

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..