2015-12-08 43 views
0

对于NoSQL和Mongoose,我是一个新手。我一直在寻找一点,但无法真正找到我要找的东西(这让我更难以知道答案)。Mongoose NodeJS - 查找每个用户的最后一条插入记录

基本上,我有一个用户正在添加的记录列表。这些记录包含一些数据,我想要列出每个用户最新插入的消息。

在SQL中,我会写;

SELECT * FROM records ORDER BY inserted_date GROUP BY user_id; 

这会返回一个像这样的集合;

[ 
    {user: 2, insert_date: 2015-08-12T15:15:00, message: "Hi"}, 
    {user: 3, insert_date: 2015-08-12T15:12:00, message: "Also hi"}, 
    {user: 5, insert_date: 2015-08-12T15:14:00, message: "Not hi"} 
] 

我一直在环顾四周,发现一些答案,但这些似乎并没有工作。

我试过了;

https://stackoverflow.com/a/7570091/1493455

和其他一些总的thingie像这样;

Record.aggregate(
    {}, 
    { 
     $group: { 
      _id: '$user_id', 
      inserted: { $last: "$inserted" }, 
      message: { $last: "$message" } 
     } 
    }, 
    function(err, messages) { 
     console.log(err, messages); 
    } 
); 

我从另一个答案复制 - 但我真的不明白它在做什么,甚至应该做什么。

我当然可以为每个用户使用排序和限制查询,但这看起来效率很低。

我很高兴,如果有人能在正确的方向:)点我

+0

我刚刚可能发现了一个重复的问题; http://stackoverflow.com/questions/29410749/mongoose-find-last-message-from-each-user?rq=1我会在一秒钟内回复。 –

回答

0

是的,重复的:Mongoose - find last message from each user

我结束了我的固定代码;

Record.aggregate(
    [ 
     // Matching pipeline, similar to find 
     { 
      "$match": {} 
     }, 
     // Sorting pipeline 
     { 
      "$sort": { 
       "inserted": -1 
      } 
     }, 
     // Grouping pipeline 
     { 
      "$group": { 
       "_id": "$user_id", 
       "message": { 
        "$first": "$message" 
       }, 
       "inserted": { 
        "$first": "$inserted" 
       } 
      } 
     }, 
     // Project pipeline, similar to select 
     { 
      "$project": { 
       "_id": 0, 
       "user_id": "$_id", 
       "message": 1, 
       "inserted": 1 
      } 
     } 
    ], 
    function(err, messages) { 
     console.log(err, messages); 
    } 
); 

和更新,以代替旧(2.x的)我是运行最新的MongoDB(3.4)(这给出错误,因为总尚不支持)。

相关问题