mongodb储存即时聊天的时候如何取出用户聊天列表
仅有的幸福
仅有的幸福 2017-05-02 09:20:07
0
1
675
{
        "_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 問題です。SQLServer などの SQL データベースにも対応する式があります。 リーリー 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})これは、MongoDB の aggregation を使用することで解決できます。 aggregation は大きなトピックです。ここですべての内容を説明することは不可能です。以下で使用されるさまざまな演算子を理解するには、ドキュメントを確認するしかありません。

    リーリー
  4. いくつかの説明:
  • 🎜{$sort: {_id: -1}} を使用すると、実際には逆時系列になります。 _id には時間が含まれており、ほとんどの場合、それを並べ替えることは並べ替え時間と見なされます 🎜🎜。
  • 🎜$first は最初の要素を取得します。最初の n 要素を取得したい場合はどうすればよいでしょうか? $push+$slice で十分です 🎜🎜
  • 🎜上記のクエリを高速化するにはどうすればよいでしょうか? db.chat.createIndex({current_uid: 1, _id: 1})🎜🎜 🎜
  • いいねを押す +0
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート