我正在尝试为我的移动应用构建一个事件跟踪系统。我正在为我的需求评估mongodb,我没有任何NoSQL数据库的实践经验。我已经彻底阅读了mongodb文档,并根据我的需要提出了以下架构设计
1.必须具有可水平扩展的数据存储
2.数据存储必须在分片环境中快速执行组查询
3.必须具有极高的写入吞吐量
Collections:
Events:
{name:'<name>', happened_at:'<timestamp>', user : { imei: '<imei>', model_id: '<model_id>'}
Devices:
{model_id:'<model_id>', device_width:<width>, memory: '<memory>', cpu: '<cpu>'}
我不希望将设备存储为events.user中的嵌入式文档,以便在我发展最快的集合(即事件)中节省存储空间。设备集合不会增长太多,并且必须具有不超过30k的记录。虽然事件收集每天都会增加几百万份文件。
我的数据增长需要一个分片环境,我们将从第1天开始关注它,因此不会使用任何在分片系统中不起作用的东西。 例如组功能不适用于分片,我们总是会根据需要编写mongo M / R命令。
问题:让所有在设备上执行特定事件(name ='abc happen')的用户的最佳方法是什么,其中device_width <300。 我的解决方案:找到所有具有device_width <300的模型,并使用结果过滤此类模型上的事件文档。
问题:返回设备上特定事件(name ='abc happen')的用户数,根据设备的cpu分组 我的解决方案:获取给定事件的用户数,按model_ids分组(&lt; 30k记录,我知道)。进一步使用与model_id相关的cpu并返回最终结果。
如果我以正确的方式这样做,请告诉我。如果没有,那么大规模的做法是什么?
编辑:还请指出是否有任何可能的警告,如索引可能无法用于map / reduce的最大效果。