sql >> Database >  >> NoSQL >> MongoDB

Mongodb-berekeningsquery - cumulatieve vermenigvuldiging

U kunt onderstaande aggregatie gebruiken:

db.ccpsample.aggregate([
  { $sort: { ccp_id: 1, period: 1 } },
  { 
    $group: {
      _id: "$ccp_id",
      items: { $push: "$$ROOT" },
      baseSale: { $first: "$sales" },
      growths: { $push: "$growth" }
    }
  },
  {
    $unwind: {
      path: "$items",
      includeArrayIndex: "index"
    }
  },
  {
    $project: {
      cpp_id: "$items.cpp_id",
      period: "$items.period",
      growth: "$items.growth",
      sales: {
        $cond: {
          if: { $ne: [ "$items.sales", "NULL" ] },
          then: "$items.sales",
          else: {
            $reduce: {
              input: { $slice: [ "$growths", "$index" ] },
              initialValue: "$baseSale",
              in: { $multiply: [ "$$value", { $add: [1, { $divide: [ "$$this", 100 ] }] } ] }
            }
          }
        }
      }
    }
  }
])

In principe om de waarde te berekenen voor n-th element moet je de volgende dingen weten:

  • verkoopwaarde van eerste element ($first in $group )
  • de reeks van alle growths ($push in $group )
  • de n die aangeeft hoeveel vermenigvuldigingen je moet uitvoeren

Om de index te berekenen moet je $push alle elementen in één array en gebruik vervolgens $unwind met includeArrayIndex optie die de index van de afgewikkelde array invoegt in het veld index .

De laatste stap berekent de cumulatieve vermenigvuldiging. Het gebruikt $slice met index veld om te evalueren hoeveel growths verwerkt moeten worden. Er zal dus één element zijn voor 601 , twee elementen voor 602 enzovoort.

Dan is het tijd voor $reduce om die matrix te verwerken en de vermenigvuldigingen uit te voeren op basis van uw formule:(1 + (growth/100) )




  1. Een URL-verkorter bouwen met Node.js en MongoDB

  2. Bulkinsertprestaties in MongoDB voor grote collecties

  3. Hoe maak je een back-up en herstel je ClusterControl

  4. Mongoose-fout - geen 'toObject'-methode na upgrade