在几乎没有关系的数据上使用NoSQL

时间:2014-05-20 15:11:13

标签: mongodb aggregation-framework database nosql

我目前正在计划开发一项服务,该服务应处理大量请求,并且每个请求都会进行一些日志记录。 每个日志将具有以下形式

{event: "EVENTTYPE", userid: "UID", itemid: "ITEMID", timestamp: DATETIME}

我希望能够完成大量的写作,而阅读和分析每小时只会进行一次。

数据分析中的一个要求是我必须能够执行以下查询: 是否为用户(UID)记录了项目(ITEMID)上的事件A和B? (甚至可以根据时间戳告诉事件A是否在事件B之前出现)

我已经将MongoDB视为我的存储解决方案。

  • 上面的查询是否可以(正确)由MongoDB聚合框架执行?
  • 将来我可以添加到分析步骤,从ITEMID到ITEM.Categories(我有一组项目,每个项目都有一系列类别)。可能有趣的是,在过去30天内知道在按个别项目类别分组的项目上发生了多少次事件A.那么MongoDB是否适合我的要求?

有关我将要使用的数据的一些信息: 我希望平均每天记录10,000次活动。 我还没有决定,数据是否应该无限期存储。

  • MongoDB是否适合我的要求?还有另一个NoSQL数据库可以更好地处理我的需求吗? NoSQL在这种情况下是否可用,或者我最好不要使用关系数据库?
  • 如果我对分析频率的要求发生变化,请说从一小时到实时。我相信Redis会比MongoDB更好地服务于我的目的,这是否正确理解?

1 个答案:

答案 0 :(得分:0)

  

是否为用户(UID)记录了项目(ITEMID)上的事件A和B? (甚至可以根据时间戳告诉事件A是否在事件B之前出现)   可以通过MongoDB聚合框架(正确)执行上述查询吗?

是的,绝对的。您可以使用$group运算符按ITEMID,UID汇总事件,您可以在分组之前通过$match过滤结果以将其限制为特定时间段,或者使用任何其他过滤器,您可以推送每种类型事件的时间(第一个,最后一个)到$group运算符创建的文档中。然后,如果您愿意,可以使用$project创建一个字段,指示之前的内容。

聚合框架的所有功能都在这里概述:

http://docs.mongodb.org/manual/core/aggregation-pipeline/

  

将来我可能会加入分析   步骤,从ITEMID到ITEM.Categories的关系(我有一个   项目集合,每个项目都有一系列类别)。   知道事件A的次数可能会很有趣   发生在按个别项目类别分组的项目上   过去30天。那么MongoDB是否适合我的要求?

是。 MongoDB中的聚合允许您使用$unwind数组,以便您可以根据需要按类别对事物进行分组。使用聚合框架很容易实现您所描述的所有内容。

MongoDB是否是您的应用程序的正确选择超出了本网站的范围,但您在此问题中列出的要求可以在MongoDB中实现。