MongoDB获得最近10项活动

时间:2014-03-24 09:20:50

标签: mongodb

在我的社交网络中,我想获得成员A 的Feed,成员A 正在关注 20类别/成员
当类别/成员(后跟成员A )执行活动时,会将其插入名为 recent_activity 的集合中:

{
   "content_id": "6", // content id member A is following
   "content_type_id": "6",// content type (category , other member)
   "social_network_id": "2", // the action category did (add/like/follow)
   "member_id": "51758", //Member A
   "date_added": ISODate("2014-03-23T11:37:03.0Z"),
   "platform_id": NumberInt(2),
   "_id": ObjectId("532ec75f6b1f76fa2d8b457b"),
   "_type": {
     "0": "Altibbi_Mongo_RecentActivity" 
  } 
}

我想在成员A 登录系统时获取类别/成员的最后10项活动

我的问题:

如何获得所有类别/成员的10项活动

最好在一个查询中执行此操作或执行for循环。

2 个答案:

答案 0 :(得分:1)

对于这个用例,我建议反转逻辑并为成员A保留最新10个活动的单独对象,并始终保持最新状态。虽然这种解决方案的写入量更大,但它使读取变得非常简单,并且可以非常容易地扩展。我想公开宣传我刚才写的一篇关于news feeds with mongodb的博文,其中概述了这种方法。

这个'粉丝'这种方法起初可能看起来过于复杂,但是当你考虑重要性过滤/排名(啦啦啦),推送特别重要的事件(facebook,twitter)或常规摘要电子邮件(几乎所有)时,你会得到一个位置。代码来执行所有这些逻辑。

答案 1 :(得分:0)

我认为我评论说T&#t。我没有真正看到选择标准。所以如果你在外面"一个集合,然后你有问题。但是,如果您指定的字段是您想要的内容,那么过滤"通过,然后就这样做:

db.collection.find({
    "social_network_id": "2",
    "content_type_id": "6",
    "content_id": "6",
    "member_id": { "$ne": "51758" }
})
.sort({ "$natural": -1 })
.limit(10);

那是做什么的?您匹配数据中的各种条件以进行"类别匹配" (如果我理解了这意味着什么),那么你要确保你匹配同一成员的条目。

最后的部分是"自然"分类。这是重要,因为ObjectIdmonotinic,或数学代表"不断增加"。这意味着"最新的"条目总是最高的"值。所以降序是#34;最新的"到最老的"。

最后一部分是基本的#34;限制"。所以只返回最后10个条目。

只要你可以"过滤"在你想要的任何方式的同一集合中,这应该没问题。