javascript - Meteor + Mongo 平均计数

标签 javascript mongodb algorithm math meteor

假设我有这样一个文档

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

现在我想获得相同产品的每个组合的平均值以对齐(如果它被选中对齐)所以我使用 meteor 观察 handle 来执行此操作。并在相关文档的每次更改时获得汇总平均价格值

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。我在这里需要一个整数,但是当我使用 vanilla JS 的任何方法删除小数值时。例如 toFixed() 它会给我少 1 或多 1 的值。我从晚上开始就在电脑上撞头。任何帮助将不胜感激。

Last change yet give me 96.01 或者 95.99

最佳答案

您不需要为计算平均值添加额外的逻辑。
只需按照以下步骤或使用 mongoDB $avg 运算符。

1) 在您的情况下,您首先会获得所有具有 alignToOffer: false 的文档。

2) 使用聚合计算平均值后。 或者像下面这样手动计算。

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

1)

let result = Offers.find({ 产品:offer.product, 状态:真实, alignToOffer:假, combId: Number(offer.combId) })。拿来();//获取 meteor 。

2)

//如果只获取一个文档则设置它的价格不需要计算平均 让 avg = result.length > 1 ? 结果.map(obj => obj.price).reduce((o,n) => o + n)/result.length : 结果[0].价格;

3)

优惠.更新({ 产品:offer.product, alignToOffer:真, 状态:真实, combId: Number(offer.combId) }, {$set:{ price : Number(avg) }}, { multi: true });

关于javascript - Meteor + Mongo 平均计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41225763/

相关文章:

javascript - Angular 2 : How to filter records between two dates?

performance - 在 MongoDB 中存储日期

algorithm - 拼写检查重复字母

javascript - React Bootstrap Table 无法创建带有映射错误的 TableHeaderColumn。 TableHeaderColumn 中没有定义任何键列

php - 将 PHP 变量传递给 Javascript 函数(特定代码错误)

python - 将 mongodb 与 FLASK 和 python 一起使用

c++ - 在 boost::posix_time::ptime 和 mongo::Date_t 之间转换

java - java中如何查找二维字符串数组中的唯一元素?

r - R中神经网络的算法在给定的重复次数中不收敛

javascript - 一个 GetDataAsync 请求中的 OfficeJS 多个绑定(bind)