假设我有这样一个文档
{
"_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.99999999999996
或 96.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/