実際には、 $type
のドキュメントに「落とし穴」がリストされています。 特にアレイについて:
配列に適用すると、$typeは指定されたタイプの内部要素と一致します。射影がない場合、これは、いずれかの要素が適切なタイプである場合、配列全体が一致することを意味します。投影を使用すると、結果には要求されたタイプの要素のみが含まれます。
つまり、「要素自体」が配列内にあるかどうかを検出するのではなく、実際にテストされているのは配列の「内部要素」であり、それがどのタイプであるかを確認します。
現在、ドキュメント自体は、 $where
を使用したこのJavaScriptテストを提案しています。 :
.find({ "$where": "return Array.isArray(this.author)" })
しかし、もっと良い方法があるので、それはかなり恐ろしいことだと思います。
秘訣は、0
を要求する「ドット表記」にあります。 配列の要素を$exists
にインデックス付けします
.find({ "author.0": { "$exists": true } })
これは、「0番目」の要素が存在する場合、フィールドが存在するため、データが配列であるという基本的なケースです。
その論理的な前提を理解したら、それは非常に簡単なテストです。それと一致できない唯一のものは「真に空の」配列です。その場合、必要に応じてJavaScriptの代替にフォールバックできます。ただし、これは実際にはインデックスを使用できるため、後者の形式を使用することをお勧めします。