2014-11-04 14 views
5

powiedzmy Mam bazę danych Mongo wiadomości, które wygląda tak:listingu ostatnią wiadomość każdej rozmowie angażowania użytkownika, w 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 
} 

Więc jak mogę odzyskać ostatnią wiadomość z każdej rozmowy, użytkownik "drewno" może mieć?

Ktoś jeszcze zamieścił podobne pytanie, jak to zrobić w mysql. Pytam, jak to zrobić w mangurze.

będę zakładać, że dla odniesienia okrywać pomaga: Private messaging system. Listing last message of each conversation

Byłoby wspaniale, gdyby mógł mi pomóc. Dziękuję za pomoc. Bardzo to doceniam. Jestem nowy w mangusta, mongodb i node.js. Pochodzę ze strony php mysql.

Byłoby wspaniale, gdyby można było opublikować rzeczywisty kod, jak to zrobić, aby można było wypróbować i podać opinię. Dzięki.

Moje schematu bazy danych wygląda następująco:

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 } 
}); 

dowodem jacy ludzie uruchomić witrynie: http://i62.tinypic.com/bbntx.jpg

Pozostawienie tej stronie, jak można powiedzieć, jakiego rodzaju nieprzyjaznych ludzi korzysta z tej witryny . Prawdopodobnie zapytam gdzie indziej. Oni tak naprawdę nie troszczą się o pomoc. Dbają o swoje zasady. Twoja nowa osoba, której nie witają. Jestem mile widziany nigdzie indziej, nie traktowany jak brud, jak ludzie tutaj.

Odpowiedz

6

Witamy w przepełnieniu stosu. To przyzwoite pytanie, które napisałeś. Proszę pozwolić mi skorzystać z przywileju, aby pomóc ci w sposób, w jaki mogę.

To jest polecenie agregacji, które można uruchomić w powłoce Mongo. Proszę znaleźć wyjaśnienie w tekście.

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"} 
    } 
} 
]) 

Możesz uruchomić poniżej na mangusta.

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); 
} 
) 
+0

jesteś podróżnikiem w czasie? –

+0

@ T.Rex - :) dlaczego pytasz? – BatScream

+0

Przepraszam za to :) Tak jak zacząłeś, jak bardzo grzeczny angielski dżentelmen sprzed czasów decorum stał się niemodny. –

Powiązane problemy