我一直在试验Mongo Aggregation Framework,在这里的人们的帮助下,我能够为给定的输入生成正确的输出文档集。我有几个概念问题,但我希望大家可以帮我设计。
我的应用程序是一个运行时系统,它收集它处理的所有事务的数据。所有这些数据都写入Mongo中的分布式分片集合。我需要做的是定期(此时每5秒)运行一个遍历此数据的作业,通过龋齿类别将其汇总,并将汇总的文档附加到一组现有集合(或一个现有集合)。
我对Mongo Aggregration的工作方式有几个挑战:
1 - $ out管道阶段不会附加到目标集合,它会覆盖它 - 我需要附加到不断增长的集合中。它也无法写入分片集合,但我认为这不是一个大问题。
2 - 我不知道如何将其配置为基本上“尾随”输入集合。现在我需要从服务器运行它,并且必须在运行aggregate()命令之前标记要用查询处理的文档集,然后让另一个作业定期返回源集合删除文档已被标记为处理(这假设聚合工作正常并且正确地滚动它们 - 没有交易性)。
任何人都有更好的方法可以做到这一点?
谢谢,
伊恩
答案 0 :(得分:0)
我建议查看版本3.6(去年11月发布)和称为更改流的功能。改变流是有效的尾巴"你追求。伪代码中的紧凑程序看起来像这样。另请注意我们如何在inputCollection
上迭代聚合并按文档将doc写入outputCollection
。
tailableCursor = db.inputCollection.watch()
while(true) {
// Block until something comes in;
document = next(tailableCursor);
// Examine document to ensure it is of interest
if(of interest) {
cur2 = db.inputCollection.aggregate([pipeline]);
while(cur.hasNext()) {
db.outputCollection.insert(cur.next());
}
}
}