Tatsächlich gibt es in der Dokumentation für $type
einen Fehler speziell über Arrays:
Bei Anwendung auf Arrays stimmt $type mit jedem inneren Element überein, das vom angegebenen Typ ist. Ohne Projektion bedeutet dies, dass das gesamte Array übereinstimmt, wenn ein Element den richtigen Typ hat. Bei der Projektion enthalten die Ergebnisse nur die Elemente des angeforderten Typs.
Das bedeutet also, dass anstatt zu erkennen, ob sich das "Element selbst" im Array befindet, tatsächlich das "innere Element" des Arrays getestet wird, um zu sehen, um welchen Typ es sich handelt.
Nun schlägt die Dokumentation selbst diesen JavaScript-Test mit $where
vor :
.find({ "$where": "return Array.isArray(this.author)" })
Aber ich finde das ziemlich schrecklich, da es einen besseren Weg gibt.
Der Trick liegt in der "Punktnotation", wo Sie nach der 0
fragen index-Element des Arrays zu $exists
.find({ "author.0": { "$exists": true } })
Dies ist nur der grundlegende Fall, dass das Feld vorhanden ist und die Daten daher ein Array sind, wenn das "0." Element vorhanden ist.
Sobald Sie diese logische Prämisse verstanden haben, ist es ein ziemlich einfacher Test. Das einzige, was damit nicht abgeglichen werden kann, ist ein "wirklich leeres" Array, in diesem Fall können Sie bei Bedarf auf die JavaScript-Alternative zurückgreifen. Aber dies kann tatsächlich einen Index verwenden, daher wäre es vorzuziehen, die letztere Form zu verwenden.