mongodb儲存即時聊天的時候如何取出使用者聊天列表
仅有的幸福
仅有的幸福 2017-05-02 09:20:07
0
1
613
{
        "_id" : ObjectId("576cfd363325ffaa1dbdde15"),
        "current_uid" : "5",
        "to_uid" : "3",
        "content" : "你大爷"
    },
    {
        "_id" : ObjectId("576cfd6e3325ff501e07f4ae"),
        "current_uid" : "5",
        "to_uid" : "3",
        "content" : "郭德纲"
    },
    {
        "_id" : ObjectId("576cfe753325ff501ea76603"),
        "current_uid" : "5",
        "to_uid" : "4",
        "content" : "325235"
    }

存的時候如上所示,想要獲取用戶ID為5的這個跟哪些人聊過天,也就是3和4這2個用戶,現在想要獲取包括content的信息,也就是跟該用戶最新的一筆記錄,例如3這個用戶,我要獲取的就是郭德綱這個content而不是上面那條,這個該怎麼查詢,初學mongodb,球幫助

仅有的幸福
仅有的幸福

全部回覆(1)
洪涛

這是一個很典型的分組TOP N問題,放到SQL資料庫裡面也有對應的表達方式,例如SQLServer的

ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

MongoDB裡面用aggregation就可以解决了。aggregation是個很大的話題,這裡沒辦法講解全部內容,下面用到的各種操作符只能自己去查下文檔理解。

db.chat.aggregate([
    {$match: {current_uid: "5"}},
    {$sort: {_id: -1}},
    {$group: {_id: {current_uid: "$current_uid", to_uid: "$to_uid"}, content: {$first: "$content"}}}
])

幾點解釋:

  1. 使用{$sort: {_id: -1}}其实就是时间倒序。_id裡麵包含了時間,對它的排序大部分時候可以認為是對時間的排序;

  2. $first取到了第一个元素。如果想取头n个元素怎么办?$push+$slice就可以了;

  3. 以上查詢怎麼能更快? db.chat.createIndex({current_uid: 1, _id: 1})

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板