sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur använder man $elemMatch på aggregatets projektion?

Ganska på gammal fråga men bokstavligen inget av de föreslagna svaren är bra.

TLDR :

Du kan inte använda $elemMatch i ett $projektstadium. men du kan uppnå samma resultat med andra aggregeringsoperatorer som $filter.

db.itens.aggregate([
    {
        $project: {
            compList: {
               $filter: {
                input: "$complist",
                as: "item",
                cond: {$eq: ["$$item.a", 1]}
               }
            }
        }
    }
])

Och om du bara vill ha det första objektet från arrayen som matchar villkoret på samma sätt som vad $elemMatch gör kan du införliva $arrayElemAt

Ingående förklaring :

Låt oss först förstå $elemMatch:

$elemMatch är ett frågeuttryck medan även den här projektionsversionen av den existerar, detta hänvisar till en frågeprojektion och inte $project aggregeringsstadiet.

Än sen då? vad har detta med något att göra? väl ett $projekt-steg har en viss indatastruktur det kan ha medan den vi vill använda är:

:

Vad är ett giltigt uttryck?

Uttryck kan inkludera fältvägar, literaler, systemvariabler, uttrycksobjekt och uttrycksoperatorer. Uttryck kan kapslas.

Så vi vill använda en uttrycksoperator, men som du kan se från dokumentets $elemMatch är inte en del av det. därför är det inte ett giltigt uttryck som ska användas i ett aggregerings $project skede.



  1. hur kan man lagra en Json i redis med hashmap(HSET)

  2. Kunde inte hämta en resurs från poolen (SocketTimeoutException:)

  3. Gruppräkning med MongoDB med hjälp av aggregeringsramverk

  4. Hur ökar jag ett nummervärde i Mongoose?