복붙노트

[MONGODB] MongoDB를에서, 사용자를 포함, 각 대화의 마지막 메시지 목록

MONGODB

MongoDB를에서, 사용자를 포함, 각 대화의 마지막 메시지 목록

말 내가 메시지 몽고 데이터베이스가 있습니다 그 다음과 같다 :

{
  "_id": ObjectId("5458009c1ab2354c029d7178"),
  "to": "dan",
  "from": "wood",
  "message": "hi dan how are you?",
  "time": new Date(1415053468590),
  "__v": 0
}
{
  "_id": ObjectId("545800b45eaf364d026c1cba"),
  "to": "wood",
  "from": "dan",
  "message": "hi wood how are you?",
  "time": new Date(1415053492125),
  "__v": 0
}
{
  "_id": ObjectId("5458009c1ab2354c029d7178"),
  "to": "billy",
  "from": "wood",
  "message": "hi billy how are you?",
  "time": new Date(1415053468590),
  "__v": 0
}
{
  "_id": ObjectId("545800b45eaf364d026c1cba"),
  "to": "wood",
  "from": "billy",
  "message": "hi wood how are you?",
  "time": new Date(1415053492125),
  "__v": 0
}

그래서 사용자 "나무"가있을 수 있음을 각 대화에서 마지막 메시지를 검색 할 수있는 방법?

다른 사람이 이미 MySQL의에서이 작업을 수행하는 방법에 대한 비슷한 질문을 올렸습니다. 나는 몽구스에서이 작업을 수행하는 방법을 요구하고있다.

그것이 도움 넣다 나는 참조를 위해이를 게시 할 예정입니다 : 개인 메시징 시스템. 각 대화의 마지막 메시지 목록

당신이 나를 도울 수 있다면 좋은 것입니다. 도와 주셔서 감사 해요. 정말 감사. 나는 몽구스, MongoDB를하고 node.js. 새로운 오전 나는 PHP는 MySQL의 배경에서 왔습니다.

당신이 그것을 수행하는 방법의 실제 코드를 게시 할 수 있다면 나는 그것을 밖으로 시도하고 피드백을 제공 할 수 있도록 좋은 것입니다. 감사.

내 데이터베이스 스키마는 다음과 같습니다 :

var messageSchema = new Schema({
to: { type: String, required: true},
from: { type: String, required: true},
message: { type: String, required: true},
time : { type : Date, default: Date.now }
});

어떤 사람들이 어떤 증명이 사이트를 실행합니다 : http://i62.tinypic.com/bbntx.jpg

이 사이트를 실행하는 비우호적 인 사람들이 어떤 종류의 말할 수있는이 웹 사이트를 떠난다. 일리노이 아마 다른 곳에서 부탁드립니다. 그들은 실제로 도움에 대해 걱정하지 않는다. 그들은 그들의 규칙에 대해 신경. 그렇지 않은 귀하의 새로운 사람은 당신을 환영합니다. ID가 다른 곳에서도 환영 사람들이 여기처럼 먼지처럼 취급하지 될 수있다.

해결법

  1. ==============================

    1.스택 오버 플로우에 오신 것을 환영합니다. 그 괜찮은 질문, 당신은 기록했다. 제가 할 수있는 방법으로 당신을 도울 수있는 특권을 주시기 바랍니다.

    스택 오버 플로우에 오신 것을 환영합니다. 그 괜찮은 질문, 당신은 기록했다. 제가 할 수있는 방법으로 당신을 도울 수있는 특권을 주시기 바랍니다.

    이것은 몽고 쉘에서 실행할 수있는 집계 명령입니다. 설명 인라인을 찾아주세요.

    db.collection.aggregate([
    //match all those records which involve Wood.
    {$match:{$or:[{"to":"wood"},{"from":"wood"}]}},
    // sort all the messages by descending order
    {$sort:{time:-1}},
    {
        // Now we need to group messages together, based on the to and from field.
        // We generate a key - "last_message_between", with the value being a concatenation
        // result of the values in to and from field.
        // Now, Messages from Wood to billy and Billy to wood should be treated under a single group right.
        // To achieve that, we do a small trick to make the result contain the name coming last
        // alphabetically, first. So our key for all the Messages from Wood to Billy and Billy to Wood would be 
        // "Wood and Billy".
        // And then we just display the first document that appears in the group, that would be the 
        // latest Message.
        $group:{"_id":{
        "last_message_between":{
            $cond:[
                {
                    $gt:[
                    {$substr:["$to",0,1]},
                    {$substr:["$from",0,1]}]
                },
                {$concat:["$to"," and ","$from"]},
                {$concat:["$from"," and ","$to"]}
            ]
        }
        },"message":{$first:"$$ROOT"}
        }
    }
    ])
    

    당신은 몽구스의 아래 실행할 수 있습니다.

    Collection.aggregate(
    {$match:{$or:[{"to":"wood"},{"from":"wood"}]}},
    {$sort:{time:-1}},
    {
        $group:{"_id":{
        "last_message_between":{
            $cond:[
                {
                    $gt:[
                    {$substr:["$to",0,1]},
                    {$substr:["$from",0,1]}]
                },
                {$concat:["$to"," and ","$from"]},
                {$concat:["$from"," and ","$to"]}
            ]
        }
        },"message":{$first:"$$ROOT"}
        }
    },
    function(err, res)
    {
        if (err) return handleError(err);
        console.log(res);
    }
    )
    
  2. from https://stackoverflow.com/questions/26725658/listing-the-last-message-of-each-conversation-involving-an-user-in-mongodb by cc-by-sa and MIT license