MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB Abbina un array con $type?

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.