2012-03-25 63 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

相關問題