Nogal een oude vraag, maar letterlijk geen van de voorgestelde antwoorden is goed.
TLDR :
U kunt $elemMatch niet gebruiken in een $project-fase. maar je kunt hetzelfde resultaat bereiken met andere aggregatie-operators zoals $filter.
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
En als u alleen het eerste item uit de array wilt dat overeenkomt met de voorwaarde die vergelijkbaar is met wat $elemMatch doet, kunt u $arrayElemAt opnemen
Uitgebreide uitleg :
Laten we eerst $elemMatch begrijpen:
$elemMatch is een query-expressie, terwijl ook deze projectieversie ervan bestaat, dit verwijst naar een queryprojectie en niet naar $project-aggregatiefase.
En dan? wat heeft dit er mee te maken? welnu, een $project-fase heeft een bepaalde invoerstructuur die het kan hebben, terwijl degene die we willen gebruiken is:
:
Wat is een geldige uitdrukking?
Expressies kunnen veldpaden, letterlijke waarden, systeemvariabelen, expressieobjecten en expressie-operators bevatten. Uitdrukkingen kunnen worden genest.
We willen dus een expressie-operator gebruiken, maar zoals je kunt zien in $elemMatch
van het document maakt er geen deel van uit. daarom is het geen geldige uitdrukking om te gebruiken in een aggregatie $project
podium.