sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB ¿Hace coincidir una matriz con $ tipo?

En realidad, hay un "te pillé" en la documentación de $type específicamente sobre arreglos:

Cuando se aplica a matrices, $type coincide con cualquier elemento interno que sea del tipo especificado. Sin proyección, esto significa que toda la matriz coincidirá si algún elemento tiene el tipo correcto. Con proyección, los resultados incluirán solo aquellos elementos del tipo solicitado.

Eso significa que en lugar de detectar si el "elemento en sí" está en la matriz, lo que en realidad se está probando es el "elemento interno" de la matriz para ver de qué tipo es.

Ahora la propia documentación sugiere esta prueba de JavaScript con $where :

.find({ "$where": "return Array.isArray(this.author)" })

Pero creo que eso es bastante horrible ya que hay una mejor manera.

El truco está en la "notación de puntos", donde pides el 0 elemento de índice de la matriz a $exists

.find({ "author.0": { "$exists": true } })

Que es solo el caso básico de que si existe el elemento "0th", entonces el campo está presente y, por lo tanto, los datos son una matriz.

Una vez que entiendes esa premisa lógica, entonces es una prueba bastante simple. Lo único que no se puede comparar con eso es una matriz "realmente vacía", en cuyo caso puede recurrir a la alternativa de JavaScript si es necesario. Pero esto en realidad puede usar un índice, por lo que sería preferible usar la última forma.