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

Jak odzyskać oryginalny dokument po agregacji?

Należy do kategorii głupich sztuczek agregacyjnych to mała technika, która często jest pomijana.

Zapytanie wykonujące to wszystko grupuje się wokół dokumentu _id, będącego unikalnym identyfikatorem tego dokumentu. Więc głównym punktem do przemyślenia jest cały dokument jest już unikalnym identyfikatorem. Więc zamiast przechowywać w kluczu _id, użyj całego dokumentu.

    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },

Tam, gdzie jest to zrobione, wszystko, co jest zwinięte przez _id, zachowuje dokument w jego oryginalnej formie. Pod koniec wszystkich innych etapów agregacji wydaj końcowy projekt $ w celu przywrócenia prawdziwej oryginalnej formy dokumentu:

    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}

Wtedy będziesz mieć przefiltrowane wyniki, które chcesz. Ta technika może być bardzo przydatna w przypadku korzystania z zaawansowanego filtrowania, na przykład w przypadku tego zapytania, ponieważ eliminuje potrzebę wydania dodatkowego znajdź na wszystkich wynikach.

Ponadto w takim przypadku, gdy wiesz, że szukasz tylko zestawu wyników, które będą pasować do określonego zestawu warunków, użyj $match operator jako pierwszy etap procesu agregacji. Jest to przydatne nie tylko przy zmniejszaniu rozmiaru zestawu roboczego, ale jest także jedynym etap, na którym możesz skorzystać z indeksu i gdzie można znacznie zwiększyć wydajność zapytań.

Cały proces razem:

db.forms.aggregate([
    {$match: { "forms.status": "closed" } },
    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },
    {$unwind: "$forms"},
    {$group: { _id: "$_id", status: {$addToSet: "$forms.status"}}},
    {$unwind: "$status"},
    {$sort: { _id: 1, status: -1} },
    {$group: { _id: "$_id", status: {$first: "$status"} }},
    {$match: { status: "closed"}},
    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. $ lookup zwraca pustą tablicę

  2. Procent warunków OR dopasowanych w mongodb

  3. Konfigurowanie uwierzytelniania MongoDB-CR jako domyślnego w MongoDB 3.x

  4. MongoDB:Aktualizacja dokumentów przy użyciu danych z tego samego dokumentu

  5. Mongoose - spowodowane przez ::11000 E11000 zduplikowany indeks błędu klucza?