我正在通過mongodb的簡單消息傳遞系統。mongodb消息傳遞 - 獲取每個
假設我是用戶A,具有B和C的私人訊息:在我的收件箱視圖,我想能夠顯示每個最後的消息,無論是從我或B或C發送;
以臉書信息頁面爲例。這就是我想要做的。
目前,我有叫場「last.message」我在那裏存放任何兩個人的最後發送的消息,但是,有沒有辦法實現這個更好的辦法?
在此先感謝。
我正在通過mongodb的簡單消息傳遞系統。mongodb消息傳遞 - 獲取每個
假設我是用戶A,具有B和C的私人訊息:在我的收件箱視圖,我想能夠顯示每個最後的消息,無論是從我或B或C發送;
以臉書信息頁面爲例。這就是我想要做的。
目前,我有叫場「last.message」我在那裏存放任何兩個人的最後發送的消息,但是,有沒有辦法實現這個更好的辦法?
在此先感謝。
您可以保留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。
你可以使用一個架構是這樣的消息:
{ 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"}} }
])
你並不需要保持一個額外的集合(所以沒有額外寫入)和聚合查詢將使用索引的參與者,日期都$匹配和$排序操作,所以它應該是相當快的。
是的,我同意,這是一個比我建議的好的解決方案。謝了哥們 :) –
我想你錯過了最新的顯示的消息是從A到B或從B到A換句話說,你應該看到對應的最新消息,無論方向。我不認爲你的第一個集合可以通過單個查詢返回 - 需要兩個查詢。 –
@AsyaKamsky哎呀,我錯過了那部分。那麼,如果他需要擴展功能,那麼顯然他必須額外支付:)閱讀:)感謝朋友:)我修改了我的答案:) –