Na verdade, há uma "pegadinha" listada na documentação para
$type
especificamente sobre matrizes:
Quando aplicado a matrizes, $type corresponde a qualquer elemento interno do tipo especificado. Sem projeção, isso significa que todo o array corresponderá se algum elemento tiver o tipo correto. Com a projeção, os resultados incluirão apenas os elementos do tipo solicitado.
Então, isso significa que, em vez de detectar se o "elemento em si" está no array, o que está realmente sendo testado é o "elemento interno" do array para ver de que tipo ele é.
Agora a própria documentação sugere este teste de JavaScript com
$where
:.find({ "$where": "return Array.isArray(this.author)" })
Mas eu acho que é muito horrível, pois há uma maneira melhor.
O truque está na "notação de ponto", onde você pede o
0
elemento de índice do array para $exists
.find({ "author.0": { "$exists": true } })
Que é apenas o caso básico de que, se o elemento "0th" existir, o campo estará presente e os dados serão, portanto, uma matriz.
Depois de entender essa premissa lógica, então é um teste bastante simples. A única coisa que não pode ser correspondida por isso é uma matriz "verdadeiramente vazia", caso em que você pode recorrer à alternativa JavaScript, se necessário. Mas isso pode realmente usar um índice, então seria preferível usar a última forma.