mongodb储存即时聊天的时候如何取出用户聊天列表
仅有的幸福
仅有的幸福 2017-05-02 09:20:07
0
1
629
{
        "_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,球帮助

仅有的幸福
仅有的幸福

répondre à tous(1)
洪涛

Il s'agit d'un problème de regroupement très typique TOP N, et il existe des expressions correspondantes dans les bases de données SQL, telles que

de SQLServer.
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

Ce problème peut être résolu en utilisant aggregation dans MongoDB. aggregation est un gros sujet, et je ne peux pas expliquer tout le contenu ici. Vous pouvez uniquement consulter la documentation pour comprendre les différents opérateurs utilisés ci-dessous.

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

Quelques explications :

  1. L'utilisation de {$sort: {_id: -1}} est en fait l'ordre chronologique inverse. _id contient du temps, et la plupart du temps son tri peut être considéré comme du temps de tri

  2. $first obtient le premier élément. Et si vous souhaitez prendre les n premiers éléments ? $push+$slice c'est bien

  3. Comment la requête ci-dessus peut-elle être effectuée plus rapidement ? db.chat.createIndex({current_uid: 1, _id: 1})

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal