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.