2012-03-25 94 views
2

我对谈话的集合:MongoDB - 从每个对话中获取1条最后一条消息?

{_id: ..., from: userA, to: userB, message: "Hello!", datetime: ...} 

我想告诉用户的对话的预览 - 从当前用户和其他用户之间的每个会话中的最后消息。因此,当用户点击某个“最后一条消息”时,他会转到下一页,其中包含他与该用户之间的所有消息。

如何在没有Map/Reduce的情况下执行此操作(从每个对话中获取最后一条消息)?

1)使用“distinct”命令? (怎么样?)

2)为最后一条消息设置“last”标志?我认为这不是很安全......

3)..?

+0

神似:HTTP://计算器。 com/questions/6498506/mongodb-select-the-top-n-rows-from-each-group – Thilo 2012-03-25 11:20:58

+0

谢谢,但我已经阅读过了。我认为这对我而言并不是非常有效,因为我的系统会有成千上万条消息,我认为每次用户添加消息时都会对数千个文档进行更新并不好(因为它建议$ inc“年龄“字段在所有相关的文档)。 – oyatek 2012-03-25 11:29:12

回答

3

我写了一个复杂的答案,这个问题使用游标和很多advanced query功能和东西......这是痛苦和混乱。然后我意识到,这是痛苦的,因为这不是mongodb期望你真正做到的事情。

我认为你应该做的只是将数据非规格化并轻松解决这个问题。具体方法如下:

  • 将散列/对象领域上的用户名为most_recent_conversations
  • 当你与其他用户新的对话,以便它看起来像这样更新:

    previewUser.most_recent_conversations[userConversedWith._id] = newestConversation._id 
    
  • 每次您进行新的对话时,只需使用较新的对话ID来粉碎参与其哈希的用户的价值。现在我们有一个{ uid: conversationId, ... }结构,其中基本上我们需要的预览数据。

  • 现在你可以看一下最近的谈话(或N对话如果进行散列的每个值的数组!)简单地说:

    var previewUser = db.users.findOne({ _id: someId }); 
    var recentIds = []; 
    for(uid in previewUser.most_recent_conversations) { 
        recentIds.push(previewUser.most_recent_conversations[uid]); 
    } 
    var recentConversations = db.conversations.find({ 
        _id: { $in: recentIds } 
    }); 
    
+0

谢谢,我也想过类似的方法。我会等待更多的答案。 – oyatek 2012-03-25 15:39:37

+0

我正面临同样的问题,然后我再次想到,如果您需要聚集或缩小前端操作的映射,那么您会做错某些事情。 – Sekai 2014-09-04 11:21:53

+0

但是这仍然不能缩放^^ – Sekai 2014-09-04 11:56:07

相关问题