sql >> Database >  >> NoSQL >> MongoDB

Hoe dit resultaat te krijgen met aggregaat in mongoDB

Mongo 3.4-versie

$map om de prijs en waarde van het artikel te vermenigvuldigen en $reduce om de som van de prijs en waarde van het artikel te berekenen en $reduce om de som van de kostprijs te berekenen. $trek waarden af ​​van eerdere verlagingen om het uiteindelijke bedrag te krijgen.

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"]
                    }
                }
            }]
        }

    }
}])

Mongo 3.x-versie

Eerste $project om de waarde en prijs van het item te vermenigvuldigen. Volgende groepering om de som voor zowel items als kostenvelden te berekenen, wat resulteert in één matrixwaarde voor elk item en kostenveld en het uiteindelijke project kijkt alleen naar de matrixwaarde van beide arrays met $arrayElemAt om de waarden van elkaar af te trekken.

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]
                }]
            }
        }
    }])

Mongo 2.6-versie

$unwind items en groep om de som van de waarden te berekenen die worden geretourneerd door de prijs en waarde van het item te vermenigvuldigen en $unwind de kosten om de som van de prijs en de waarde van het item en het project te berekenen om $waarden af ​​te trekken van de vorige groepering om het uiteindelijke bedrag te berekenen.

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. Hoe implementeer je een automatisch oplopende primaire ID in MongoDB?

  2. Mongodb (code=exited, status=14) is mislukt, maar geen duidelijke fouten

  3. vind subarray-documenten in meteor

  4. MongoDB gebruikt NOT en AND samen