Mongodb:最后N条记录,跳过收集大小 - 30?

时间:2014-10-26 11:39:03

标签: javascript node.js mongodb

简单:

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()

知道我是怎么做到的吗?

2 个答案:

答案 0 :(得分:0)

您可以使用skip(80).limit(30).sort({sent:-1})获取最近30个文档,然后在您的客户端应用中按照您想要的方式对其进行排序。

答案 1 :(得分: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);
            }
        });
    }
},