mongodbの個別のフィールドに関連する属性の数を含むエンティティをクエリします

d。フェルバー

私は2つのコレクションを持っています。boxesおよびballsボールは箱の中に入れることができます:

boxes:
[{
  "_id": { "$oid": "box-a" },
  "name": "Box A"
},{
  "_id": { "$oid": "box-b" },
  "name": "Box B"
}]
balls:
[{
  "_id": { "$oid": "ball-a" },
  "color": "red",
  "boxId": { "$oid": "box-a" }
},{
  "_id": { "$oid": "ball-b" },
  "color": "green",
  "boxId": { "$oid": "box-a" }
}]

ここで、追加のフィールドを使用してすべてのボックスにクエリを実行ballColorsし、ボックス内にある色のボールの数の概要を取得します。

[{
  "_id": { "$oid": "box-a" },
  "name": "Box A",
  "ballColors": {
    "red": 1,
    "green": 1,
  }
},{
  "_id": { "$oid": "box-b" },
  "name": "Box B",
  "ballColors": {}
}]

私は次のような集計でそれを解決しようとしました:

db.boxes.aggregate([
  {$lookup: {
    from: "balls",
    localField: "_id",
    foreignField: "boxId",
    as: "ballColors"
  }},
  {$addFields: {
    ballColors: "$ballColors.color"
  }}
])

...しかし、これは私にそのようなものを与えます:

[{
  "_id": { "$oid": "box-a" },
  "name": "Box A",
  "ballColors": [
    "red",
    "green"
  ]
},{
  "_id": { "$oid": "box-b" },
  "name": "Box B",
  "ballColors": []
}]

$unwind組み合わせていくつかの実験も行い$groupましたが、それらの情報を元のオブジェクトに戻す方法がわかりません...

色を数えてballColorsオブジェクトに入れる方法はありますか?または、これを行う別のより良い方法はありますか?

turivishal
  • $lookupパイプラインを_id使用boxIDしてlet$match boxId条件を通過ます
  • $groupによってcolor、合計数を取得します
  • $project kを色として、vをカウントとして表示します
  • 使用してオブジェクトに変換キー値のアレイ$arrayTOobject$addFields
db.boxes.aggregate([
  {
    $lookup: {
      from: "balls",
      let: { boxId: "$_id" },
      pipeline: [
        { $match: { $expr: { $eq: ["$$boxId", "$boxId"] } } },
        {
          $group: {
            _id: "$color",
            count: { $sum: 1 }
          }
        },
        {
          $project: {
            _id: 0,
            k: "$_id",
            v: "$count"
          }
        }
      ],
      as: "ballColors"
    }
  },
  { $addFields: { ballColors: { $arrayToObject: "$ballColors" } } }
])

遊び場

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

別のテーブルのフィールドに関連するエントリを選択します

分類Dev

GORMを使用して、多対多の関係で関連付けられている他のテーブルからのエンティティを含むテーブルをフィルタリングする方法

分類Dev

QueryDsl-関連するエンティティの複数のフィールドに対するJPAクエリ

分類Dev

Hibernateクエリを使用して、関連付けを持つエンティティの一部のフィールドのみをフェッチするにはどうすればよいですか?

分類Dev

エンティティテーブルとプロパティを含む個別のテーブルがあり、エレガントなSQLクエリを作成する方法

分類Dev

c#/エンティティフレームワークを使用して、クエリをあるエンティティから別のエンティティにリダイレクトします

分類Dev

Symfony-1つのメインエンティティをフォームを介して別のエンティティにリンクします

分類Dev

EFCore:関連エンティティのフィールドの最大値に基づいて関連エンティティをクエリします

分類Dev

複数のエンティティを含むCriteriaAPIのルートエンティティからのみ列を含むSQLクエリを生成するようにHibernateを制限する方法

分類Dev

特定のフィールドの個別の$ typeに対するMongoDBクエリ

分類Dev

エンティティのすべての関連データを含める

分類Dev

MongoDbのフィールドの個別の値の数をカウントするサブクエリ

分類Dev

EFコア:関連する1対多のエンティティの複数のレベルでデータをクエリする正しい方法

分類Dev

別のエンティティタイプのリストを含むSpringDataJPAにエンティティを保存します

分類Dev

zend Framework 2 +ドクトリン:関連するエンティティを含むメディアの削除

分類Dev

関連するエンティティのカスタムフォーマットフィールドを含むエンティティをフェッチするLINQクエリ?

分類Dev

別の結合されたエンティティフィールド値に従って1つのエンティティをクエリします

分類Dev

ベースエンティティの共通識別子に基づいて関連エンティティをフィルタリングする

分類Dev

関連するエンティティから独立したJPAエンティティリスナーを個別に指定する

分類Dev

親をプロパティとして含むエンティティのリストをロードする

分類Dev

MySQLクエリ-関連するテーブルに1つのフィールドが存在しない場合でも、コンサルトを返します

分類Dev

Hibernateエンティティにフィールドを追加して、このエンティティが別のテーブルで参照されているかどうかをブール値で示す最もクリーンな方法

分類Dev

c#を使用して、DynamicsCRMの各エンティティからの連絡先に関連するフィールド名を取得します

分類Dev

関連のないテーブルをLinqからエンティティクエリに含める

分類Dev

一部のフィールドに複数の値を含むMySQLクエリを使用してテーブルを作成します

分類Dev

エンティティIDを含む@RequestBody属性をSpringの対応するエンティティに変換します

分類Dev

Entity Framework Coreは、関連するエンティティをフィルタリングし、各グループの上位2つを取得します

分類Dev

「含める」エンティティをフィルタリングすると、関連データの読み込みが機能しません

分類Dev

別の既存のエンティティを含む新しいエンティティを作成する

Related 関連記事

  1. 1

    別のテーブルのフィールドに関連するエントリを選択します

  2. 2

    GORMを使用して、多対多の関係で関連付けられている他のテーブルからのエンティティを含むテーブルをフィルタリングする方法

  3. 3

    QueryDsl-関連するエンティティの複数のフィールドに対するJPAクエリ

  4. 4

    Hibernateクエリを使用して、関連付けを持つエンティティの一部のフィールドのみをフェッチするにはどうすればよいですか?

  5. 5

    エンティティテーブルとプロパティを含む個別のテーブルがあり、エレガントなSQLクエリを作成する方法

  6. 6

    c#/エンティティフレームワークを使用して、クエリをあるエンティティから別のエンティティにリダイレクトします

  7. 7

    Symfony-1つのメインエンティティをフォームを介して別のエンティティにリンクします

  8. 8

    EFCore:関連エンティティのフィールドの最大値に基づいて関連エンティティをクエリします

  9. 9

    複数のエンティティを含むCriteriaAPIのルートエンティティからのみ列を含むSQLクエリを生成するようにHibernateを制限する方法

  10. 10

    特定のフィールドの個別の$ typeに対するMongoDBクエリ

  11. 11

    エンティティのすべての関連データを含める

  12. 12

    MongoDbのフィールドの個別の値の数をカウントするサブクエリ

  13. 13

    EFコア:関連する1対多のエンティティの複数のレベルでデータをクエリする正しい方法

  14. 14

    別のエンティティタイプのリストを含むSpringDataJPAにエンティティを保存します

  15. 15

    zend Framework 2 +ドクトリン:関連するエンティティを含むメディアの削除

  16. 16

    関連するエンティティのカスタムフォーマットフィールドを含むエンティティをフェッチするLINQクエリ?

  17. 17

    別の結合されたエンティティフィールド値に従って1つのエンティティをクエリします

  18. 18

    ベースエンティティの共通識別子に基づいて関連エンティティをフィルタリングする

  19. 19

    関連するエンティティから独立したJPAエンティティリスナーを個別に指定する

  20. 20

    親をプロパティとして含むエンティティのリストをロードする

  21. 21

    MySQLクエリ-関連するテーブルに1つのフィールドが存在しない場合でも、コンサルトを返します

  22. 22

    Hibernateエンティティにフィールドを追加して、このエンティティが別のテーブルで参照されているかどうかをブール値で示す最もクリーンな方法

  23. 23

    c#を使用して、DynamicsCRMの各エンティティからの連絡先に関連するフィールド名を取得します

  24. 24

    関連のないテーブルをLinqからエンティティクエリに含める

  25. 25

    一部のフィールドに複数の値を含むMySQLクエリを使用してテーブルを作成します

  26. 26

    エンティティIDを含む@RequestBody属性をSpringの対応するエンティティに変換します

  27. 27

    Entity Framework Coreは、関連するエンティティをフィルタリングし、各グループの上位2つを取得します

  28. 28

    「含める」エンティティをフィルタリングすると、関連データの読み込みが機能しません

  29. 29

    別の既存のエンティティを含む新しいエンティティを作成する

ホットタグ

アーカイブ