MongoDB - 从每个对话中获取最后一条消息?

时间:2012-03-25 11:14:31

标签: mongodb messaging

我有一个会话集合:

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

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

如果没有Map / Reduce,我该怎么做(从每个对话中得到最后一条消息?)

1)使用“distinct”命令? (工作原理)

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

3)..?

1 个答案:

答案 0 :(得分: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 }
    });