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

$ match集計で値の配列を見つけて、結果をグループ化するにはどうすればよいですか?

    filtersを変更する必要があります 以下に示すように。

    説明

    1. $addFieldsを使用してドキュメント構造にフィルターを含めます オペレーター。これは、必要なすべての値を計算するのに役立ちます。
    2. toysをフィルタリングします 最近含まれているfilters $exprの属性 オペレーター。
    3. $filterを適用する 演算子、同じcodeを持つすべてのおもちゃを取得します filtersから 。これで、totalを計算できます およびprice_total 値。
    4. total_coincidencesを計算できます $group内 このようなステージ:

    しかし、あなたは「明確な要素」について言及しました。そこで、ユニークなおもちゃのコードのセットを作成し、そのセット内のアイテムを数えます。

    db.collection.aggregate([
      {
        $unwind: "$toys"
      },
      {
        $addFields: {
          "filters": [
            {
              "code": 17001,
              "quantify": 2
            },
            {
              "code": 17003,
              "quantify": 4
            },
            {
              "code": 17005,
              "quantify": 5
            },
            {
              "code": 17005,
              "quantify": 6
            }
          ]
        }
      },
      {
        $match: {
          $expr: {
            $in: [ "$toys.code", "$filters.code"]
          }
        }
      },
      {
        $group: {
          _id: "$toystore_name",
          total_coincidences: {
            $addToSet: "$toys.code"
          },
          toy_array: {
            $push: {
              "price_original": "$toys.price",
              "toy": "$toys.toy",
              "total": {
                $size: {
                  $filter: {
                    input: "$filters",
                    cond: {
                      $eq: [ "$$this.code", "$toys.code"]
                    }
                  }
                }
              },
              price_total: {
                $sum: {
                  $map: {
                    input: {
                      $filter: {
                        input: "$filters",
                        cond: {
                          $eq: [ "$$this.code", "$toys.code" ]
                        }
                      }
                    },
                    in: {
                      $multiply: [ "$toys.price", "$$this.quantify" ]
                    }
                  }
                }
              }
            }
          }
        }
      },
      {
        $addFields: {
          total_coincidences: {
            $size: "$total_coincidences"
          }
        }
      },
      {
        $sort: { _id: 1 }
      }
    ])
    

    MongoPlayground




    1. 作成されたデータ/コレクションが欠落している春のmongodbコンパス

    2. CentOS7でMongoDB3.0.2サービスを開始できません

    3. fedora12のphpredis

    4. NodeJSExpressの依存性注入とデータベース接続