2014-10-26 2 views
0

Простой:Mongodb: последние N записей, пропустить размер коллекции - 30?

models.Message.find({ chat_id: req.params.chat_id }).skip(80).limit(30).sort({sent:1}).exec(function(err, message) { 
    if(err) { 
     res.json({error: 'Message not found.'}); 
    } else { 
     res.json(message); 
    } 
}); 

Как я могу написать skip() пропустить всю коллекцию минус последние 30 лет, что делает его динамичным?


деталь:

Причина мне нужно сделать это, потому что это приложение чат и сообщения нужно вернуть старых к новым, следовательно, sort({sent:1}) но коллекция может получить большой, и я только хочу для отправки 30 документов.

Так, например

[ 
    {sent: 1, message:'hey'}, 
    {sent: 2, message:'sup'}, 
    {sent: 3, message:'nttn much'} 
] 

Для этого примера я хочу отправить 1 сообщение клиента, статический это может выглядеть следующим образом.

models.Message.find({ chat_id: req.params.chat_id }).skip(2).limit(1).sort({sent:1}).exec(function(err, message) { 
    if(err) { 
     res.json({error: 'Message not found.'}); 
    } else { 
     res.json(message); 
    } 
}); 

Это вернет последние {sent: 3, message:'nttn much'}, это хорошо.

НО без метода пропускаемого это будет выглядеть следующим образом

models.Message.find({ chat_id: req.params.chat_id }).limit(1).sort({sent:1}).exec(function(err, message) { 
    if(err) { 
     res.json({error: 'Message not found.'}); 
    } else { 
     res.json(message); 
    } 
}); 

возвращение этого клиенту {sent: 1, message:'hey'}, не так хорошо.

Так, очевидно, мне нужно пропустить, мне нужно сделать больше соскабливать на документы MongoDB, но там должен быть способ проверить длину сбора, то минус x или в этом случае около 30, а затем передать, что к skip() ?

Любая идея, как я это делаю?

ответ

0

Вы можете использовать skip(80).limit(30).sort({sent:-1}), чтобы получить последние 30 документов, а затем в своем клиентском приложении отсортируйте его по своему желанию.

+0

Мне нравится, что и считал, но в то же время чувствую, что я хочу, чтобы справиться с этим все на стороне сервера, я понимая, что после запроса к БД 'message' является массивом объектов, так что я могу использовать ваниль JS для удаления объектов из массива объектов, затем 'res.json' новый массив объектов. Работая над этим сейчас. –

0

Итак, я понял, что могу работать с объектом после запроса БД до выполнения res.json и отправки клиенту. Вот что я придумал и, похоже, сейчас работает.

getById: function(req, res) { 
    if (req.user) { 
     models.Message.find({ chat_id: req.params.chat_id }).sort({sent:1}).exec(function(err, message) { 
      if(err) { 
       res.json({error: 'Message not found.'}); 
      } else { 
       console.log(message.length); 
       message = message.slice(message.length - 30); 
       console.log(message); 
       res.json(message); 
      } 
     }); 
    } 
}, 
+0

Вероятно, нужно переименовать 'сообщение' в' сообщения', но если кто-нибудь имеет какие-либо комментарии по поводу того, почему это не идеально, я все уши. –

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