En fait, il y a un "gotcha" répertorié dans la documentation pour $type
spécifiquement sur les tableaux :
Lorsqu'il est appliqué à des tableaux, $type correspond à tout élément interne du type spécifié. Sans projection, cela signifie que le tableau entier correspondra si un élément a le bon type. Avec la projection, les résultats incluront uniquement les éléments du type demandé.
Cela signifie donc qu'au lieu de détecter si "l'élément lui-même" est dans le tableau, ce qui est réellement testé est "l'élément interne" du tableau pour voir de quel type il s'agit.
Maintenant, la documentation elle-même suggère ce test JavaScript avec $where
:
.find({ "$where": "return Array.isArray(this.author)" })
Mais je pense que c'est assez horrible car il existe un meilleur moyen.
L'astuce est en "notation par points", où vous demandez le 0
indexer l'élément du tableau sur $exists
.find({ "author.0": { "$exists": true } })
Ce qui est juste le cas de base que si l'élément "0th" existe, alors le champ est présent et les données sont donc un tableau.
Une fois que vous avez compris cette prémisse logique, c'est un test assez simple. La seule chose qui ne peut pas correspondre à cela est un tableau "vraiment vide", auquel cas vous pouvez revenir à l'alternative JavaScript si nécessaire. Mais cela peut en fait utiliser un index, il serait donc préférable d'utiliser cette dernière forme.