sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb-beregningsforespørgsel - kumulativ multiplikation

Du kan bruge nedenstående aggregering:

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

Grundlæggende for at beregne værdien for n-th element du skal vide følgende ting:

  • salgsværdi af første element ($first i $group )
  • rækken af ​​alle growths ($push i $group )
  • n som angiver hvor mange gange du skal udføre

For at beregne indekset skal du $push alle elementer i ét array, og brug derefter $unwind med includeArrayIndex mulighed, som vil indsætte indekset for afviklet array i feltet index .

Sidste trin beregner den kumulative multiplikation. Den bruger $slice med index felt for at evaluere, hvor mange growths skal behandles. Så der vil være ét element til 601 , to elementer til 602 og så videre.

Så er det tid til $reduce at behandle det array og udføre multiplikationerne baseret på din formel:(1 + (growth/100) )




  1. Konvertering af mongo-array til objekt med nøgleværdi-par

  2. Flyt et element fra et array til et andet inden for samme dokument MongoDB

  3. import mongoose-skema til en anden skemafil gør det importerede skema udefineret

  4. $fitler indlejret array ved hjælp af $lte $gte