MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB Corresponde a um array com $type?


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.