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

MongoDB Porovnat pole s $type?

Ve skutečnosti je v dokumentaci pro $type uvedena "gotcha". konkrétně o polích:

Když se použije na pole, $type odpovídá jakémukoli vnitřnímu prvku, který je zadaného typu. Bez projekce to znamená, že celé pole bude odpovídat, pokud má některý prvek správný typ. S projekcí budou výsledky zahrnovat pouze prvky požadovaného typu.

To tedy znamená, že namísto zjišťování, zda je „prvek sám o sobě“ v poli, je ve skutečnosti testován „vnitřní prvek“ pole, aby se zjistilo, o jaký typ se jedná.

Nyní samotná dokumentace navrhuje tento test JavaScriptu s $where :

.find({ "$where": "return Array.isArray(this.author)" })

Ale myslím, že je to dost hrozné, protože existuje lepší způsob.

Trik je v "tečkové notaci", kde se ptáte na 0 index prvku pole na $exists

.find({ "author.0": { "$exists": true } })

Což je jen základní případ, že pokud existuje prvek "0th", pak je pole přítomno a data jsou tedy pole.

Jakmile pochopíte tento logický předpoklad, pak je to docela jednoduchý test. Jediné, co se s tím nedá vyrovnat, je „skutečně prázdné“ pole, v takovém případě se můžete v případě potřeby vrátit k alternativě JavaScriptu. Ale toto může ve skutečnosti používat index, takže by bylo vhodnější použít druhou formu.



  1. Jak nastavit limit pro velikost pole ve schématu Mongoose

  2. Aktualizace cesty 'x' by vytvořila konflikt v 'x'

  3. Jaká je dobrá strategie pro seskupování podobných slov?

  4. Aktualizace velkého počtu záznamů v kolekci