.distinct()
を使用して条件をクエリします
「ドキュメントの選択」に適用され、ドキュメントの「内部」に含まれる配列エントリには適用されません。配列コンテンツを「フィルタリング」する必要がある場合は、 .aggregate()
代わりに、配列応答の「値」のみを取得するための少しの後処理も行います。
db.collection.aggregate([
{ "$match": { "_id": "TEST" } },
{ "$unwind": "$payload" },
{ "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
{ "$group": { "_id": "$payload._id" } },
]).map( d => d._id );
主な部分は、 $ unwind
です。
パイプラインステージ。これは主に、配列内の値を後で $ group
の上。これにより、基本的に配列メンバーごとに新しいドキュメントが作成されますが、各ドキュメントにはその配列メンバーのみが含まれます。配列を含むMongoDB構造の「非正規化」です。
次は、次の $ match
です。
パイプライン。他のクエリと同じように機能し、条件に一致するドキュメントのみを選択します。すべての配列メンバーが「ドキュメント」になっているため、一致しないエントリ(ドキュメントとして)は除外されます。または、 $ filter
を使用することもできます。
配列のまま抽出しますが、 $unwindが必要なので
次の段階では、単に $ match
を使用することもできます。 。
この時点では、条件に一致する配列エントリのみが残ります。 $ group
「異なる」値を取得することであるため、通常は、単一のドキュメントや、ここでの値がまだ異なるものよりも幅広い選択に対してこれを行います。つまり、これは実際にはとまったく同じ動作を維持しているだけです。 .distinct()
無傷。
最後に、 .aggregate()<の出力以降/ code>
.distinct()のデザインとは異なりますコード>
結果に「ドキュメント」が返されるという点で、 .map()
カーソルの結果を処理し、特定のドキュメントプロパティの「値」のみを「配列」として返すメソッド。