如何有效地使用MongoDB创建具有支点的实时分析?

时间:2011-11-16 20:59:44

标签: mongodb real-time analytics

所以我不断获得大量数据,这些数据已被收集到processedData集合中。数据如下:

{
    date: "2011-12-4",
    time: 2243,
    gender: {
        males: 1231,
        females: 322
    },
    age: 32
}

所以我会不断地获得大量这样的数据对象。我希望能够看到40岁以上的所有“男性”。由于数据的庞大规模,这似乎不是一个有效的查询。

任何提示?

2 个答案:

答案 0 :(得分:1)

一般来说,你不能。

但是,根据实际需要,可能会有一些快捷方式。你想在所有数据集中计算“40岁以上的男性”,还是只计算一天?

1天:将您的数据拆分为每日收藏(processedData-20111121,...),这将有助于您的查询。您也可以缓存此类查询的结果。

整个数据集:预聚合数据。也就是说,在插入新数据条目时,请执行以下操作:

db.preaggregated.update({_id : 'male_40'},
     {$set : {gender : 'm', age : 40}, $inc : {count : 1231}},
     true);

同样,如果您事先知道所有查询,则可以预先计算它们(而不是保留原始数据)。

这还取决于您如何定义“实时”以及您将拥有多大的查询负载。在某些情况下,只需触发ad-hoc map-reduced。

答案 1 :(得分:0)

我的猜测你的目标GUI是一个网站?在那种情况下,你正在寻找一种叫做彗星的东西。您应该创建一个处理所有数据的图层,并向您的客户端或事件总线广播新的突变(详见下文)。 Mongo不启用实时数据,因为它不会在突变上发出任何内容。因此,您可以使用任何适合您的数据存储。

根据您使用的语言,您有不同的选择(对于彗星):

  • Socket.io(nodejs) - Javascript
  • Cometd - Java
  • SignalR - C#
  • Libwebsocket - C ++

大多数情况下,您需要一个事件总线或消息队列来放置突变事件。看看JMS,Redis或NServiceBus(取决于你将使用什么)。