sql >> データベース >  >> NoSQL >> MongoDB

配列内の条件に基づいて、配列から個別の値を取得します

    .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() カーソルの結果を処理し、特定のドキュメントプロパティの「値」のみを「配列」として返すメソッド。



    1. Spring Dataを使ってmongoのクエリプランを表示するにはどうすればよいですか(別名cursor.explain())

    2. 毎日のグループ化内のMongoDB集約

    3. 日付付きのドキュメントをmongoに挿入するにはどうすればよいですか?

    4. mongodbの文字列日付形式でクエリ