W rzeczywistości w dokumentacji $type
znajduje się „gotcha” konkretnie o tablicach:
Po zastosowaniu do tablic, $type dopasowuje każdy wewnętrzny element określonego typu. Bez projekcji oznacza to, że cała tablica będzie pasować, jeśli jakikolwiek element ma właściwy typ. W przypadku projekcji wyniki będą zawierały tylko te elementy żądanego typu.
Oznacza to, że zamiast wykrywać, czy „sam element” znajduje się w tablicy, testowany jest „wewnętrzny element” tablicy, aby zobaczyć, jakiego typu jest.
Teraz sama dokumentacja sugeruje ten test JavaScript z $where
:
.find({ "$where": "return Array.isArray(this.author)" })
Ale myślę, że to dość okropne, ponieważ istnieje lepszy sposób.
Sztuczka polega na "notacji kropkowej", w której prosisz o 0
indeks elementu tablicy do $exists
.find({ "author.0": { "$exists": true } })
Co jest tylko podstawowym przypadkiem, w którym jeśli element „0” istnieje, to pole jest obecne, a zatem dane są tablicą.
Kiedy zrozumiesz tę logiczną przesłankę, będzie to całkiem prosty test. Jedyną rzeczą, której nie można przez to dopasować, jest "naprawdę pusta" tablica, w takim przypadku możesz w razie potrzeby wrócić do alternatywy JavaScript. Ale to może faktycznie używać indeksu, więc byłoby preferowane użycie drugiej formy.