MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak używać $elemMatch do projekcji agregatu?

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Warunkowa suma $ w MongoDB

  2. Dlaczego hasOwnProperty modelu mangusty zwraca wartość false, gdy właściwość istnieje?

  3. Jak wyczyścić konsolę w MongoDB

  4. Mongoexport przy użyciu ograniczeń $gt i $lt w zakresie dat

  5. Mongo DB znajduje wszystkie rekordy o najwyższej wartości w zależności od pola kluczowego