sql >> Databáze >  >> NoSQL >> MongoDB

Získejte odlišné hodnoty z pole na základě podmínek v poli

Podmínky dotazu pomocí .distinct() platí pro "výběr dokumentu" a ne pro položky pole obsažené "uvnitř" dokumentu. Pokud potřebujete „filtrovat“ obsah pole, použijte .aggregate() místo toho a také malé dodatečné zpracování pro získání pouze "hodnot" v odpovědi pole.

db.collection.aggregate([
  { "$match": { "_id": "TEST" } },
  { "$unwind": "$payload" },
  { "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
  { "$group": { "_id": "$payload._id" } },
]).map( d => d._id );

Hlavní části jsou $unwind fáze potrubí, kterou děláte především proto, že chcete, aby se hodnoty z pole později používaly jako klíč k $group na. To v podstatě vytvoří nový dokument pro každý člen pole, ale každý dokument obsahuje pouze tento člen pole. Je to "denormalizace" pro struktury MongoDB, které obsahují pole.

Další věc je následující $match pipeline, který funguje jako každý dotaz a vybírá pouze dokumenty, které odpovídají podmínkám. Vzhledem k tomu, že všechny členy pole jsou nyní "dokumenty", jsou vyloučeny neshodné položky (jako dokumenty). Alternativně můžete použít $filter extrahovat, zatímco je stále pole, ale protože potřebujeme $unwind pro další fázi můžeme také jednoduše $match .

V tomto okamžiku vám zbývají pouze položky pole, které odpovídají podmínkám. $group je získat "odlišné" hodnoty, takže obvykle byste to udělali přes širší výběr než jen jeden dokument nebo cokoli, kde hodnoty zde již nejsou odlišné. Takže to je opravdu jen zachování stejného chování .distinct() neporušené.

Konečně, protože výstup .aggregate() se liší od návrhu .distinct() protože ve výsledcích vrací „dokumenty“, jednoduše použijeme .map() metoda pro zpracování výsledků kurzoru a vrácení pouze "hodnot" z konkrétní vlastnosti dokumentu jako "pole".



  1. Snížení pole typu číslo v mongodb a nodejs

  2. Proč tento aktualizační dotaz aktualizuje pouze jeden záznam jednou

  3. Chyba připojení MongoDB v kapce Digital Ocean

  4. Jedinečný řídký index Mongodb