2012-03-25 7 views
2

私は会話のためのコレクションを持っている:MongoDB - 各会話から最後に1つのメッセージを取得しますか?

{_id: ..., from: userA, to: userB, message: "Hello!", datetime: ...} 

私は、ユーザの会話のプレビューを表示したい - 現在のユーザーと他のユーザー間の各会話からの最後のメッセージを。だから、ユーザーが "最後のメッセージ"をクリックすると、彼と彼との間のすべてのメッセージとともに次のページに行きます。

私は地図なし/削減(各会話から1つの最後のメッセージを取得する)ことを?どのように行うのですか

1) "distinct"コマンドを使用しますか? (どう?)

2)最後のメッセージに「last」フラグを設定しますか?私はそれがあまり安全ではないと思う...

3)?

+0

非常に似ます。http:// stackoverflowの。 com/questions/6498506/mongodb-select-the-top-n-rows-from-each-group – Thilo

+0

ありがとうございます。私のシステムでは数千ものメッセージがあるので、私の場合はそれほど効果的ではないと思います。ユーザがメッセージを追加するたびに何千ものドキュメントを更新するのは良いことではないと思います($ inc "すべての関連ドキュメントの「年齢」フィールド)。 – oyatek

答えて

3

すると、私はカーソルとadvanced query機能と多くのものを使用して、この質問に対する複雑な答えを書いていた...それは苦痛と混乱しました。それから、私は、mongodbがあなたが実際にやることをあなたが期待する方法ではないので、これは痛いことであることに気付きました。私はあなたがやるべきだと思う何

だけで、データを非正規化し、簡単に一発でこの問題を解決するためです。

  • は、あなたが他のユーザーとの新しい会話をするとき、most_recent_conversations
  • と呼ばれる自分のユーザーにハッシュ/オブジェクトのフィールドを入れて、それは次のようになりますように、それを更新:

    previewUser.most_recent_conversations[userConversedWith._id] = newestConversation._id 
    
  • ここで方法です

    新しい会話をするたびに、ハッシュに関係するユーザーの値を新しい会話IDで叩くだけです。今度は{ uid: conversationId, ... }という構造を持っています。のプレビューデータです。

  • 今、あなたは、最新の会話検索することができ、単純に(あなたはハッシュ配列の各値を加えた場合やNの会話を!):

    var previewUser = db.users.findOne({ _id: someId }); 
    var recentIds = []; 
    for(uid in previewUser.most_recent_conversations) { 
        recentIds.push(previewUser.most_recent_conversations[uid]); 
    } 
    var recentConversations = db.conversations.find({ 
        _id: { $in: recentIds } 
    }); 
    
+0

ありがとう、私も同様のアプローチについて考えました。もっと答えが来るのを待つよ。 – oyatek

+0

私は同じ問題に直面していました。そして、フロントエンド操作の集約やマップの縮小が必要な場合は、何か間違っています。 – Sekai

+0

でも、これは縮尺通りではありません^^ – Sekai

関連する問題