0

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

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

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

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:[]
}
4

1 回答 1

0

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

  1. $project用户 ID事件
  2. $展开事件字段
  3. $match 事件的ts高于您要比较的事件
  4. $按ts排序

这比 PHP 中的排序和过滤效率更高。

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

于 2013-10-21T11:40:29.993 回答