Не включва полето, защото не сте поискали полето да се върне. Нещото, което пропускате тук, е използването на $first
или подобен "акумулатор"
за да върнете елемента по време на $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
задължително използвайте "акумулатор"
.
Предлагам да отделите време, за да разгледате всички оператори за агрегиране и какво всъщност правят. Има примерна употреба с всеки оператор