In realtà c'è un "gotcha" elencato nella documentazione per $type
in particolare sugli array:
Quando applicato agli array, $type corrisponde a qualsiasi elemento interno del tipo specificato. Senza proiezione ciò significa che l'intero array corrisponderà se qualsiasi elemento ha il tipo giusto. Con la proiezione, i risultati includeranno solo quegli elementi del tipo richiesto.
Ciò significa che invece di rilevare se "l'elemento stesso" è nell'array, ciò che viene effettivamente testato è l'"elemento interno" dell'array per vedere di che tipo si tratta.
Ora la documentazione stessa suggerisce questo test JavaScript con $where
:
.find({ "$where": "return Array.isArray(this.author)" })
Ma penso che sia abbastanza orribile perché c'è un modo migliore.
Il trucco è nella "notazione del punto", dove chiedi lo 0
elemento di indice dell'array in $exists
.find({ "author.0": { "$exists": true } })
Che è solo il caso fondamentale in cui se l'elemento "0th" esiste, allora il campo è presente e i dati sono quindi un array.
Una volta compresa quella premessa logica, allora è un test piuttosto semplice. L'unica cosa a cui non può corrispondere è un array "veramente vuoto", nel qual caso puoi ricorrere all'alternativa JavaScript se necessario. Ma questo può effettivamente utilizzare un indice, quindi sarebbe preferibile utilizzare quest'ultimo modulo.