2015-04-02 23 views
5

Mesaj sistemi üzerinde çalışıyorum ve giriş yapan kullanıcıya mesaj gönderen her kullanıcıdan son mesajı almam gerekiyor. Ben mongodb bu yapıya sahiptir:Mongoose - her kullanıcıdan gelen son mesajı bul

[{ 
    "_id": "551bd621bb5895e4109bc3ce", 
    "from": "admin", 
    "to": "user1", 
    "message": "message1", 
    "created": "2015-04-01T11:27:29.671Z" 
}, { 
    "_id": "551bd9acf26208ac1d9b831d", 
    "from": "user1", 
    "to": "admin", 
    "message": "message2", 
    "created": "2015-04-01T11:42:36.936Z" 
}, { 
    "_id": "551bdd6d849d53001dd8a64a", 
    "from": "user1", 
    "to": "user2", 
    "message": "message3", 
    "created": "2015-04-01T11:58:37.858Z" 
}, { 
    "_id": "551bdd99849d53001dd8a64b", 
    "from": "user2", 
    "to": "admin", 
    "__v": 0, 
    "message": "message4", 
    "created": "2015-04-01T11:59:21.005Z" 
}, { 
    "_id": "551bdda1849d53001dd8a64c", 
    "from": "user1", 
    "to": "admin", 
    "__v": 0, 
    "message": "message5", 
    "created": "2015-04-01T11:59:29.971Z" 
}] 

Ben açmış kullanıcıya mesaj gönderdi her kullanıcının son mesajından alanları from, message ve created almak gerekir. Ayrı kullanmayı denedim ama sadece bir alan döndürüyor. Bunu alabilir:

Message.find({ 
     to: req.user.username 
    }) 
    .select('message created') 
    .sort('-created') 
    .exec(function (err, messages) { 
     if (err) { 
      return res.status(400).send({ 
       message: getErrorMessage(err) 
      }); 
     } else { 
      res.json(messages) 
     } 
    }); 

ama açmış kullanıcıya mesajlar gönderdi tüm kullanıcıları döndürür ve sadece benzersiz kullanıcıları ve son mesaj olması gerekir. Firavunlarla nasıl yapılacağı bir yolu var mı? senin boru hattı aşamaları $match, $sort, $group ve $project ifadeleri var

+0

olası yinelenen [ Mongodb Sorgu: Her öğe için tarihe göre en son kayıt] (http://stackoverflow.com/questions/29368141/mongodb-query-latest-record-by-date-for-each-item) – Dineshaws

cevap

7

Kullanım toplama çerçevesi: sizin örnek koleksiyonu ile,

Message.aggregate(
    [ 
     // Matching pipeline, similar to find 
     { 
      "$match": { 
       "to": req.user.username 
      } 
     }, 
     // Sorting pipeline 
     { 
      "$sort": { 
       "created": -1 
      } 
     }, 
     // Grouping pipeline 
     { 
      "$group": { 
       "_id": "$from", 
       "message": { 
        "$first": "$message" 
       }, 
       "created": { 
        "$first": "$created" 
       } 
      } 
     }, 
     // Project pipeline, similar to select 
     { 
      "$project": { 
       "_id": 0, 
       "from": "$_id", 
       "message": 1, 
       "created": 1 
      } 
     } 
    ], 
    function(err, messages) { 
     // Result is an array of documents 
     if (err) { 
      return res.status(400).send({ 
       message: getErrorMessage(err) 
      }); 
     } else { 
      res.json(messages) 
     } 
    } 
); 

Eğer req.user.username = "admin" sonra sonucudur: ait

{ 
    "result" : [ 
     { 
      "message" : "message4", 
      "created" : "2015-04-01T11:59:21.005Z", 
      "from" : "user2" 
     }, 
     { 
      "message" : "message5", 
      "created" : "2015-04-01T11:59:29.971Z", 
      "from" : "user1" 
     } 
    ], 
    "ok" : 1 
} 
+2

Awesome, thank sen! –