MongoDB - 使用推文和计算数据

时间:2011-05-27 13:42:20

标签: mongodb

我正在使用Twitter实时流API来保持特定曲目的活跃计数。例如,我想跟踪'apple','orange'和'pear'被推文的次数。我正在使用Mongo来存储推文数据,但我有一个问题是如何最好地获取我所关注的每个曲目的计数。

我将每秒运行一次此查询以获得每个曲目的接近实时计数,因此我需要确保以正确的方式执行此操作:

选项1

针对特定曲目运行计数查询

 db.tweets.count({track: 'apple'})

考虑到推文数据库将保存大量数据(可能是数百万),我想知道这可能有点慢吗?

选项2

每次收到新推文时,创建第二个集合'track_count'并更新'count'属性:

{track:'apple', count:0}
{track:'orange', count:0}
{track:'pear', count:0}

然后当有新的推文出现时:

db.track_count.update( { track:"apple" }, { $inc: { count : 1 } } );

然后我可以为每个曲目保留最新的计数,但这意味着两次写入数据库,一次用于推文,再次增加曲目计数。记住,每秒钟可能会有相当数量(数十个,也许数百个)的推文。

有没有人对这方面的最佳方法有任何建议?

2 个答案:

答案 0 :(得分:3)

毫无疑问,请使用单独的track_count集合来保持匹配数量的总计。否则,您将每秒重新查询整个tweets集合,随着数据量的增长,这将变得非常缓慢和昂贵。

不要担心两次写入数据库,一次存储推文,然后再次增加计数器。 MongoDB中的写入速度非常快,即使在单个非群集Mongo实例上,此解决方案也可以扩展到每秒数千条推文。

答案 1 :(得分:1)

  

有没有人对这方面的最佳方法有任何建议?

这里没有“最好”的方法。这是一个经典的权衡。你可以做“计数器”,你可以慢慢查询,你可以运行常规的map-reduce作业。

  • 两次写入=>更快的查询,更多的写活动
  • 一次写入=>查询速度较慢,写活动较少
  • 每小时M / R =>稍微陈旧的数据,稍微多写一些

通常建议使用计数器。 MongoDB在处理大型写入负载方面往往非常擅长,特别是这种“增量”或计数器负载。

除非你牺牲一些东西,否则你的速度不会提高。磁盘,RAM,CPU。因此,您必须根据自己的需要选择权衡。


旁注:是唯一的曲目名称?

您可能需要尝试以下操作:

{_id:'orange', count:0}
{_id:'pear', count:0}

或按日计算:

{_id:'orange_20110528', count:0}
{_id:'orange_20110529', count:0}
{_id:'pear_20110529', count:0}