这是对这个问题的重要编辑,因为我已将发布更改为方法并缩小了问题的范围。
我正在使用meteorhacks:aggregate
计算并公布用户选择的公司系列公司估值数据的平均值和中位数。选择保存在Valuations集合中以供参考,聚合数据来自Companies集合。
以下代码适用于一次性使用(尽管它不是被动的)。但是,用户将重新运行此聚合数千valuationId
秒。由于$out
将在插入新结果之前首先清除新集合,因此我无法在此处使用它,我需要保留每个实例的结果。我不明白为什么$out
会被使用。
有没有办法只使用聚合结果添加现有的Valuation文档,然后订阅该文档?
服务器/方法
Meteor.methods({
valuationAggregate: function(valuationId, valuationSelections) {
//Aggregate and publish average of company valuation data for a user-selected series of companies./
//Selections are saved in Valuations collection for reference and data for aggregation comes from Companies collection.//
check(valuationId, String);
check(valuationSelections, Array);
var pipelineSelections = [
//Match documents in Companies collection where the 'ticker' value was selected by the user.//
{$match: {ticker: {$in: valuationSelections}}},
{
$group: {
_id: null,
avgEvRevenueLtm: {$avg: {$divide: ["$capTable.enterpriseValue", "$financial.ltm.revenue"]}},
avgEvRevenueFy1: {$avg: {$divide: ["$capTable.enterpriseValue", "$financial.fy1.revenue"]}},
avgEvRevenueFy2: {$avg: {$divide: ["$capTable.enterpriseValue", "$financial.fy2.revenue"]}},
avgEvEbitdaLtm: {$avg: {$divide: ["$capTable.enterpriseValue", "$financial.ltm.ebitda"]}},
//more//
}
},
{
$project: {
_id: 0,
valuationId: {$literal: valuationId},
avgEvRevenueLtm: 1,
avgEvRevenueFy1: 1,
avgEvRevenueFy2: 1,
avgEvEbitdaLtm: 1,
//more//
}
}
];
var results = Companies.aggregate(pipelineSelections);
console.log(results);
}
});
上面的代码可以工作,只要在服务器上查看结果即可。在我的终端,我看到:
I20150926-23:50:27.766(-4)? [ { avgEvRevenueLtm: 3.988137239679733,
I20150926-23:50:27.767(-4)? avgEvRevenueFy1: 3.8159564713187155,
I20150926-23:50:27.768(-4)? avgEvRevenueFy2: 3.50111769838031,
I20150926-23:50:27.768(-4)? avgEvEbitdaLtm: 11.176476895728268,
//more//
I20150926-23:50:27.772(-4)? valuationId: 'Qg4EwpfJ5uPXyxe62' } ]
答案 0 :(得分:0)
我能够通过以下方式解决这个问题。需要添加forEach
以与$out
相同的方式展开数组。
LIB /集合
ValuationResults = new Mongo.Collection('valuationResults');
服务器/方法
var results = Companies.aggregate(pipelineSelections);
results.forEach(function(valuationResults) {
ValuationResults.update({'result.valuationId': valuationId}, {result:valuationResults}, {upsert: true});
});
console.log(ValuationResults.find({'result.valuationId': valuationId}).fetch());
}
});