繁体   English   中英

流星+ Mongo平均计数

[英]Meteor + Mongo Average Count

假设我有一个这样的文件

{
    "_id" : "PQ8GUYYB7IERPNE9NX-CombQQD7F",
    "combId" : 5,
    "alignToOffer" : true,
    "product" : "TwBuYJZquKeKTmtwr",
    "price" : 85,
}

现在,我想获取同一产品的每种组合的平均值以进行对齐(如果选中了对齐),因此我正在使用流星观察手柄进行此操作。 并获得相关文档每次更改的汇总平均价格值

Offers.find({}).observe({
   changed: function(offer, fields) {

      var result = Offers.aggregate(
          [
             {
                $match:
                {
                   product: offer.product,
                   status: true,
                   combId: Number(offer.combId)
                }
             },
             {
                $group:
                {
                   _id: "$product",
                   priceAlign: { $avg: "$price" },
                   minPrice: { $min: "$price" }
                }
             }
          ]
      );

      if ( result.length ){
         var averageValue = parseFloat(Math.round(result[0].priceAlign * 100) / 100).toFixed(2),
         bestOffer = parseFloat(Math.round(result[0].minPrice * 100) / 100).toFixed(2);
         var updateValues = { $set: {
            avgOffer: averageValue,
            bestOffer: bestOffer
         }};

         var updatePrice = { $set: {
            price : averageValue
         }};

         Offers.update({
            product: offer.product,
            combId: offer.combId,
            status: true
         }, updateValues, {multi: true});

         Offers.update({
            product: offer.product,
            combId: offer.combId,
            alignToOffer: true,
            status: true
         }, updatePrice, {multi: true});
      }
   }
});

它的工作原理非常完美,确实存在着节省平均价格的问题。 得出结论,我有三个相同产品的文档,其中两个对齐(对齐以选中要提供的密钥),而另一个则不对齐,现在当我更改固定值文档价格(未对齐)时,另外两个将保存为+1-1 (带小数位)的价格不相同,即如果我用96保存固定价格,则另一个价格为95.9999999999999696.00000000000001而不是96 我在这里需要一个整数,但是当我使用任何普通JS方法删除十进制值时。 例如toFixed()它会给我少1或多1的价值。 自从晚上以来,我在电脑上撞了个头。 任何帮助将不胜感激。

最后更改还给我96.0195.99

您无需为计算钙蛋白平均添加额外的逻辑。
只需按照以下步骤操作,或使用mongoDB $avg运算符即可。

1)首先,您将获得所有具有alignToOffer: false文档。

2)使用aggregation计算出平均值之后。 或手动计算如下。

3)在那些文件中设置alignToOffer: true很简单。

1)

let result = Offers.find({ product: offer.product, status: true, alignToOffer: false, combId: Number(offer.combId) }).fetch(); //fetch for meteor.

2)

// if get only one document then set it's price no need to calculate avg let avg = result.length > 1 ? result.map(obj => obj.price).reduce((o,n) => o + n) / result.length : result[0].price;

3)

Offers.update({ product: offer.product, alignToOffer: true, status: true, combId: Number(offer.combId) }, {$set:{ price : Number(avg) }}, { multi: true });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM