Rumah  >  Soal Jawab  >  teks badan

mongodb储存即时聊天的时候如何取出用户聊天列表

{
        "_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,球帮助

仅有的幸福仅有的幸福2751 hari yang lalu607

membalas semua(1)saya akan balas

  • PHP中文网

    PHP中文网2017-05-02 09:22:07

    Ini adalah masalah kumpulan TOP N yang sangat tipikal, dan terdapat ungkapan yang sepadan dalam pangkalan data SQL, seperti

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

    Ia boleh diselesaikan dengan menggunakan aggregation dalam MongoDB. aggregation ialah topik yang besar, dan saya tidak dapat menerangkan semuanya di sini Anda hanya boleh menyemak dokumentasi untuk memahami pelbagai operator yang digunakan di bawah.

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

    Beberapa penjelasan:

    1. Menggunakan {$sort: {_id: -1}} sebenarnya adalah susunan kronologi terbalik. _id mengandungi masa, dan kebanyakan masa pengisihannya boleh dianggap sebagai masa pengisihan;

    2. mendapat elemen pertama. Bagaimana jika anda ingin mengambil elemen n pertama?

      +$first boleh; $push$slice

    3. Bagaimanakah pertanyaan di atas boleh dibuat dengan lebih pantas?
    4. db.chat.createIndex({current_uid: 1, _id: 1})

      balas
      0
  • Batalbalas