[英]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.99999999999996
或96.00000000000001
而不是96
。 我在这里需要一个整数,但是当我使用任何普通JS方法删除十进制值时。 例如toFixed()
它会给我少1或多1的价值。 自从晚上以来,我在电脑上撞了个头。 任何帮助将不胜感激。
最后更改还给我96.01
或95.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.