2015-04-02 48 views
5

我正在處理消息系統,我需要從發送消息給登錄用戶的每個用戶獲取最後一條消息。我在MongoDB的這種結構:貓鼬 - 找到每個用戶的最後一條消息

[{ 
    "_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" 
}] 

我需要從誰發送消息給用戶登錄每個用戶的最後消息得到場frommessagecreated。我嘗試使用不同,但它只返回一個字段。我有這樣的:

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

但它返回誰發信息登錄的用戶的所有用戶,我需要有獨特的只有用戶和他們的最後一條消息。有什麼方法如何用貓鼬做到這一點?

+0

的可能重複[ Mongodb查詢:每個項目的日期最新記錄](http://stackoverflow.com/questions/29368141/mongodb-query-latest-record-by-date-for-each-item) – Dineshaws 2015-04-02 10:34:28

回答

7

使用聚合框架,您的流水線階段有$match$sort$group$project表達式:

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

如果req.user.username = "admin",與樣品收集,那麼結果是:

{ 
    "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

真棒,謝謝你! – 2015-04-02 11:06:49

相關問題