我正在使用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 } } );
然后我可以为每个曲目保留最新的计数,但这意味着两次写入数据库,一次用于推文,再次增加曲目计数。记住,每秒钟可能会有相当数量(数十个,也许数百个)的推文。
有没有人对这方面的最佳方法有任何建议?
答案 0 :(得分:3)
毫无疑问,请使用单独的track_count
集合来保持匹配数量的总计。否则,您将每秒重新查询整个tweets
集合,随着数据量的增长,这将变得非常缓慢和昂贵。
不要担心两次写入数据库,一次存储推文,然后再次增加计数器。 MongoDB中的写入速度非常快,即使在单个非群集Mongo实例上,此解决方案也可以扩展到每秒数千条推文。
答案 1 :(得分:1)
有没有人对这方面的最佳方法有任何建议?
这里没有“最好”的方法。这是一个经典的权衡。你可以做“计数器”,你可以慢慢查询,你可以运行常规的map-reduce作业。
通常建议使用计数器。 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}