2012-12-15 33 views
0

我正在通過mongodb的簡單消息傳遞系統。mongodb消息傳遞 - 獲取每個

假設我是用戶A,具有B和C的私人訊息:在我的收件箱視圖,我想能夠顯示每個最後的消息,無論是從我或B或C發送;

以臉書信息頁面爲例。這就是我想要做的。

目前,我有叫場「last.message」我在那裏存放任何兩個人的最後發送的消息,但是,有沒有辦法實現這個更好的辦法?

在此先感謝。

回答

1

您可以保留2個收藏。

先收藏,

{ sender: UserA, 
    receiver: UserB, 
    latest_message: {message: String, timestamp: Date} 
} 

二集存儲所有用戶之間的所有郵件,

{ sender: UserA, 
    receiver: UserB, 
    message: String, 
    timestamp: Date 
} 

在第一隻收集最新的消息被寫入和第一個集合需要經常更新。索引可以像{receiver : 1}{sender : 1}

第二集合存儲每條消息。這將頻繁插入。根據您的要求,索引可以像{receiver : 1, timestamp : -1}{receiver : 1, sender : 1, timestamp : -1}

通過這種方法,您可以快速,簡單地從一組朋友那裏獲得最新消息。只需2個簡單的查找查詢,沒有複雜的條件。 雖然有一個小缺點,你需要保持2集合。對於每個新消息,您都有2次寫入。 但我個人認爲它很乾淨。

您也可以考慮使用像Redis這樣的RAM數據庫來維護第一個集合。雖然它不會有如此大的差異,因爲mongo具有內置的緩存機制並使用最大的RAM。

+0

我想你錯過了最新的顯示的消息是從A到B或從B到A換句話說,你應該看到對應的最新消息,無論方向。我不認爲你的第一個集合可以通過單個查詢返回 - 需要兩個查詢。 –

+0

@AsyaKamsky哎呀,我錯過了那部分。那麼,如果他需要擴展功能,那麼顯然他必須額外支付:)閱讀:)感謝朋友:)我修改了我的答案:) –

1

你可以使用一個架構是這樣的消息:

{ sender: userA, 
    receip: userB, 
    participants: [userA, userB], 
    date: < >, 
    message: "xxx" 
} 

如果指數{參與者:1,時間:-1}您現在可以使用索引來查找所有記錄,其中用戶X是一個參與者,您可以使用該索引中的聚合框架這樣的查詢:

db.messages.aggregate([ 
    {$match:{participants:userX}}, 
    {$sort:{date:-1}}, 
    {$unwind:"$participants"}, 
    {$match:{participants:{$ne:userX}}, 
    {$group:{_id:"$participants", message:{$first:"$message"}, date: {$first:"$date"}} } 
]) 

你並不需要保持一個額外的集合(所以沒有額外寫入)和聚合查詢將使用索引的參與者,日期都$匹配和$排序操作,所以它應該是相當快的。

+0

是的,我同意,這是一個比我建議的好的解決方案。謝了哥們 :) –