Zupełnie na stare pytanie, ale dosłownie żadna z proponowanych odpowiedzi nie jest dobra.
TLDR :
Nie możesz użyć $elemMatch na etapie $projektu. ale możesz osiągnąć ten sam wynik, używając innych operatorów agregacji, takich jak $filter.
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
A jeśli chcesz tylko pierwszego elementu z tablicy, który pasuje do warunku podobnie do tego, co robi $elemMatch, możesz włączyć $arrayElemAt
Dogłębne wyjaśnienie :
Najpierw zrozummy $elemMatch:
$elemMatch to wyrażenie zapytania, chociaż istnieje również jego wersja projekcji, odnosi się to do projekcji zapytania, a nie etapu agregacji $project.
Więc co? Co to ma do rzeczy? Cóż, etap projektu $project ma pewną strukturę wejściową, którą może mieć, podczas gdy ten, którego chcemy użyć to:
Co to jest prawidłowe wyrażenie?
Wyrażenia mogą obejmować ścieżki pól, literały, zmienne systemowe, obiekty wyrażeń i operatory wyrażeń. Wyrażenia mogą być zagnieżdżane.
Więc chcemy użyć operatora wyrażenia, ale jak widać z dokumentu $elemMatch
nie jest jego częścią. dlatego nie jest to prawidłowe wyrażenie do użycia w agregacji $project
scena.