sql >> Databáze >  >> NoSQL >> MongoDB

Výpočtový dotaz Mongodb--kumulativní násobení

Můžete použít níže uvedenou agregaci:

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

V podstatě pro výpočet hodnoty pro n-th element, musíte vědět následující věci:

  • prodejní hodnota prvního prvku ($first v $group )
  • pole všech growths ($push v $group )
  • znak n který udává, kolik násobení musíte provést

Pro výpočet indexu byste měli $push všechny prvky do jednoho pole a poté použijte $unwind s includeArrayIndex volba, která vloží index rozvinutého pole do pole index .

Poslední krok vypočítá kumulativní násobení. Používá $slice s index pole pro vyhodnocení počtu growths by měly být zpracovány. Takže bude existovat jeden prvek pro 601 , dva prvky pro 602 a tak dále.

Pak je čas na $reduce zpracovat toto pole a provést násobení na základě vašeho vzorce:(1 + (growth/100) )




  1. Mongodb jak vložit POUZE, pokud neexistuje (žádná aktualizace, pokud existuje)?

  2. Mongodb - připojení přes ODBC

  3. MongoDB findAndModify. Je to opravdu atomové? Pomozte napsat řešení pro uzavřenou aktualizaci

  4. Spekulativní poprava v Hadoop MapReduce