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

mongoDBのaggregateでこの結果を取得する方法

    Mongo3.4バージョン

    $ mapはアイテムの価格と価値を乗算し、$ reduceはアイテムの価格と価値の合計を計算し、$reduceはコストの価格の合計を計算します。以前の値を$減算して、最終的な金額を取得します。

    aggregate([{
        $project: {
            _id: 1,
            amount: {
                $subtract: [{
                    $reduce: {
                        input: {
                            $map: {
                                input: "$items",
                                as: "item",
                                in: {
                                    $multiply: ["$$item.value", "$$item.price"]
                                }
                            }
                        },
                        initialValue: 0,
                        in: {
                            $add: ["$$value", "$$this"]
                        }
                    }
                }, {
                    $reduce: {
                        input: "$costs.price",
                        initialValue: 0,
                        in: {
                            $add: ["$$value", "$$this"]
                        }
                    }
                }]
            }
    
        }
    }])
    

    Mongo3.xバージョン

    アイテムの価値と価格を増やす最初の$project。次に、アイテムとコストの両方のフィールドの合計を計算するためのグループ化。これにより、アイテムとコストのフィールドごとに1つの配列値が生成され、最終的なプロジェクトでは、$ arrayElemAtを使用して両方の配列の配列値のみを調べ、相互に値を減算します。

    aggregate(
        [{
            $project: {
                vpItems: {
                    $map: {
                        input: "$items",
                        as: "item",
                        in: {
                            $multiply: ["$$item.value", "$$item.price"]
                        }
                    }
                },
                costs: '$costs'
            }
        }, {
            $group: {
                _id: '$_id',
                vpItems: {
                    $addToSet: {
                        $sum: '$vpItems'
                    }
                },
                pCosts: {
                    $addToSet: {
                        $sum: '$costs.price'
                    }
                }
            }
        }, {
            $project: {
                _id: 1,
                amount: {
                    $subtract: [{
                        $arrayElemAt: ["$vpItems", 0]
                    }, {
                        $arrayElemAt: ["$pCosts", 0]
                    }]
                }
            }
        }])
    

    Mongo2.6バージョン

    $ unwindアイテムとグループ化して返された値の合計を計算するには、アイテムの価格と値を乗算し、$ unwindコストを使用してアイテムの価格と値の合計を計算し、前のグループ化から$減算して最終的な金額を計算します。

    aggregate([{
          $unwind: '$items'
      }, {
          $group: {
              _id: '$_id',
              totalItems: {
                  $sum: {
                      $multiply: ["$items.value", "$items.price"]
                  }
              },
              costs: {
                  $first: '$costs'
              }
          }
      }, {
          $unwind: '$costs'
      }, {
          $group: {
              _id: '$_id',
              totalItems: {
                  $first: '$totalItems'
              },
              totalPrice: {
                  $sum: '$costs.price'
              }
          }
      }, {
          $project: {
              _id: 1,
              amount: {
                  $subtract: ['$totalItems', '$totalPrice']
              }
          }
      }])
    



    1. MongoクエリをLaravel、ネストされたelemMatchに変換する

    2. SQLクエリのMongo言語への翻訳

    3. SpringDataRedisの有効期限キー

    4. MongoDB:_idとObjectIDを使用した挿入時間の範囲クエリ