我有我的collection
SocialWall
,每个用户每个月都有自己的Document
,带有Event
驱动的通知。
我的问题是users
希望根据SocialWall
内Event
对象中的字段TS
获取新通知。有效地询问 你能给我自 TS 以来的所有通知吗?(为了这个例子,让我们假装TS
在同一个月内(
我在这里有一个选择,以便只给用户他/她想要的东西。
1(我是否从SocialWall
中获取整个月份的所有月份并按PHP
进行排序?
随着用户朋友的增加以及与应用程序的不同交互的增加,该数组将增长得非常快,因为用户将有很多事件。因此,我将不得不按TS
一个巨大的数组进行排序和过滤。这可能不是大规模性能或内存管理的最佳选择。
2(我是否做一个Map Reduce
函数,MongoDB
给我排序和过滤的数组?
我一直在阅读,有很多关于map reduce
效率不高的评论。是的,自2.4
以来,它有所改善,但作为一个new to Mongo
和Map Reduce
(我以前从未做过(,我不知道这对性能的真正含义。因此,我担心创建一个缓慢的查询,这反过来会给我的 Mongo 服务器带来更大的压力。此外,我一直在读到很多人更喜欢使用 Hadoop
进行复杂的查询map reduce
以获得最佳性能。
想知道我的问题当前的最佳解决方案是什么?我应该去PHP
分类还是做一个Map Reduce
?
如果Map Reduce
是最好的解决方案,我该怎么做?
文档看起来像这样
SocialWall
{
_id: MongoId
userId: MongoId
Month: 1003(MonthYear)
Events:[]
}
Event
{
_id: MongoId
userId: MongoId
ts: ISODate
details:[]
likedBy:[]
comments:[]
}
您应该尝试使用聚合框架,它对于这些目的更有效。
- $project用户 ID 和事件。
- $unwind事件字段
- $match ts 高于您要比较的事件
- $sort 由 TS 提供
这比在 PHP 中进行排序和过滤更有效。
http://docs.mongodb.org/manual/aggregation/http://www.php.net/mongocollection.aggregate