sql >> Database >  >> NoSQL >> MongoDB

Hoe $elemMatch gebruiken op de projectie van aggregaat?

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.



  1. Gegevenscompressie inschakelen in MongoDB 3.0

  2. Koppelen en maken van MongoDB-joins met SQL:deel 3

  3. Redis keyspace-melding verloopt niet actief

  4. MongoDB repliceren in een hybride cloudomgeving