2015-12-08 2 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

И некоторые другие агрегатная штучка, как это;

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

И обновление до последней MongoDB (3.4) вместо старого (2.x) я бег (это дает ошибку, потому что агрегат пока не поддерживается).

Смежные вопросы