0

私のconversationsコレクションには、複数のユーザー間でチャットを行う以下の形式のドキュメントがいくつかあります。threadId は、2 人の会話中のユーザーの 1 人の ID を保持します。

51c0c35b7daabc3410000001との会話51c0c35b7daabc3410000002

{
    "from" : ObjectId("51c0c35b7daabc3410000001"), 
    "to" : ObjectId("51c0c35b7daabc3410000002"),
    "threadId" : ObjectId("51c0c35b7daabc3410000002"),
    "message" : "Hi there!"
}

{
    "from" : ObjectId("51c0c35b7daabc3410000002"),
    "to" : ObjectId("51c0c35b7daabc3410000001"),
    "threadId" : ObjectId("51c0c35b7daabc3410000002"),
    "message" : "How are you?"
}

{
    "from" : ObjectId("51c0c35b7daabc3410000001"), 
    "to" : ObjectId("51c0c35b7daabc3410000002"),
    "threadId" : ObjectId("51c0c35b7daabc3410000002"),
    "message" : "I am good. How are you?"
}

51c0c35b7daabc3410000001との会話51c0c69989a44a6812000003

{
    "from" : ObjectId("51c0c35b7daabc3410000001"), 
    "to" : ObjectId("51c0c69989a44a6812000003"),
    "threadId" : ObjectId("51c0c69989a44a6812000003"),
    "message" : "Hello!"
}

{
    "from" : ObjectId("51c0c69989a44a6812000003"), 
    "to" : ObjectId("51c0c35b7daabc3410000001"),
    "threadId" : ObjectId("51c0c69989a44a6812000003"),
    "message" : "Hey.."
}

threadId に基づいてグループ化したいのですが、出力は次の形式にする必要があります

{
    "from" : ObjectId("51c0c35b7daabc3410000001"), 
    "to" : ObjectId("51c0c35b7daabc3410000002"),
    "threadId" : ObjectId("51c0c35b7daabc3410000002"),
    "message" : "I am good. How are you?"
}

{
    "from" : ObjectId("51c0c69989a44a6812000003"), 
    "to" : ObjectId("51c0c35b7daabc3410000001"),
    "threadId" : ObjectId("51c0c69989a44a6812000003"),
    "message" : "Hey.."
}

したがって、個別の threadId (または threadId のみに基づくグループ) を持つすべてのドキュメントを検索したいと考えています。出力には、ドキュメント内の他のすべてのフィールドも含まれている必要があります。

mapReduce、集約/グループ、個別、またはこれらの組み合わせ? どうすればいいですか?

編集

それをSQL文に入れるには、次のような単純なものが必要です

SELECT * FROM 会話 GROUP BY threadId;

4

1 に答える 1

0

私はこれをやってしまった

// Aggregate pipeline
Conversation.aggregate(
    { $match: {
        listing: new ObjectId(listingId)
      }
    },
    { $group: {
        _id: '$threadId', 
        message: { $last: "$message" },
        to: { $last: "$to" },
        from: { $last: "$from" }
      }
    },
    { $project : {
        _id : 0,
        threadId : "$_id",
        message: "$message",
        to: "$to",
        from: "$from"
      }
    },
    function(err, threads) {
        console.log(err);
        console.log(threads);
    }
);

それはうまくいくようです。もっと簡単な方法があるかどうか、またはこのスニペットを最適化できるかどうか教えてください。これが誰かに役立つことを願っています。

于 2013-06-21T06:02:50.360 に答える