Mongoose/MongoDB:获取倒数第二个文档

Posted

技术标签:

【中文标题】Mongoose/MongoDB:获取倒数第二个文档【英文标题】:Mongoose/MongoDB: Get second to last document 【发布时间】:2018-05-01 19:19:21 【问题描述】:

如何使用 Mongoose 获取第二天到最新或前一天的文档集?

我获取最新数据的代码如下:

data.findOne()
        .sort("_id": -1)
        .exec(function(err, data) 
            if (err) 
                console.log('Error getting data..');
             
            if (data) 
                res.json(data);
            
            else 
                console.log('No data found!');
            
        );

这仅返回集合中的最新文档。相反,我需要在最新的一个之前的一个,所以从这个前一天开始,我怎么能做到这一点?

【问题讨论】:

【参考方案1】:

你可以这样做:

data
.find()
.limit(2)
.sort( "_id": -1 )
.exec(function(err, data) 
    if (err) return res.json(err);
    return res.json(data);
);

这将在所有按 id:-1 排序的文档上找到,然后将结果限制为两个,这应该会给你想要的结果。

【讨论】:

嗨,谢谢你的回复,这实际上给了我最后2个数据,我只需要最新数据之前的那个...例如,今天是11/17/17 =最新, 我需要 11/16/17 = 2nd to latest【参考方案2】:

那么你必须使用聚合:

db.getCollection('data').aggregate([
   $sort: "date": -1, // sort by latest date (descending)
   $limit: 2, // limit to the first two results
   $sort: "date": 1, // sort these two ascending
   $limit: 1 // get first document
])

这条管道是这样翻译成猫鼬的(我认为):

data.aggregate([
       $sort: "date": -1,
       $limit: 2,
       $sort: "date": 1,
       $limit: 1
    ], function (err, result) 
        if (err) 
            next(err);
         else 
            res.json(result);
        
    );

此外,通过在不添加$match 管道的情况下进行排序,您的第一个$sort 将对您集合中的所有文档进行排序。因此,如果您的集合很大,您可能希望使用一些可以添加到$match 管道的查询参数来限制它们。您可以在第一个 $sort 之前添加匹配项

例如

db.getCollection('data').aggregate([
   $match: ...,
   $sort: "date": -1,
   $limit: 2,
   $sort: "date": 1,
   $limit: 1
])

【讨论】:

【参考方案3】:

这是我用来使其达到我想要的效果的修复程序,希望它可以帮助其他人:

我决定导入 MomentJS,从那里它显示当前日期,从中减去 1,以显示前一个日期的值,从而为我提供前一天的正确集合。

代码:

const moment = require('moment');

...

data.find("updated": moment().subtract(1, 'days').format('L')) ...

【讨论】:

【参考方案4】:

在最后一个之前获得第二个

data.find().sort( _id: -1 ).limit(1).skip(2).exec(function(err, data) 
            if (err) 
                console.log('Error getting data..');
             
            if (data) 
                res.json(data);
            
            else 
                console.log('No data found!');
            
        );

【讨论】:

以上是关于Mongoose/MongoDB:获取倒数第二个文档的主要内容,如果未能解决你的问题,请参考以下文章

文本域输入汉字 第二个文本域立即显示汉字的获取首个字母 如何用JS实现

Mongoose/Mongodb 数据库调用以不一致的顺序返回数据

获取列表中的倒数第二个元素

如何从上一个 bash 命令中获取倒数第二个参数? (在交互式 bash shell 中)

倒数第二个值(熊猫,Python)

如何在倒数第二个 / 之前获取字符串