蒙戈地图 减少与排序与PHP排序的社交新闻源方案


Mongo Map Reduce vs sorting with PHP for a social newsfeed scenario

我有我的collection SocialWall,每个用户每个月都有自己的Document,带有Event驱动的通知。

我的问题是users希望根据SocialWallEvent对象中的字段TS获取新通知。有效地询问 你能给我自 TS 以来的所有通知吗?(为了这个例子,让我们假装TS在同一个月内(

我在这里有一个选择,以便只给用户他/她想要的东西。

1(我是否从SocialWall中获取整个月份的所有月份并按PHP进行排序?

随着用户朋友的增加以及与应用程序的不同交互的增加,该数组将增长得非常快,因为用户将有很多事件。因此,我将不得不按TS一个巨大的数组进行排序和过滤。这可能不是大规模性能或内存管理的最佳选择。

2(我是否做一个Map Reduce函数,MongoDB给我排序和过滤的数组?

我一直在阅读,有很多关于map reduce效率不高的评论。是的,自2.4以来,它有所改善,但作为一个new to MongoMap 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:[]
}

您应该尝试使用聚合框架,它对于这些目的更有效。

  1. $project用户 ID事件
  2. $unwind事件字段
  3. $match ts 高于您要比较的事件
  4. $sort 由 TS 提供

这比在 PHP 中进行排序和过滤更有效。


http://docs.mongodb.org/manual/aggregation/http://www.php.net/mongocollection.aggregate