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 数据库调用以不一致的顺序返回数据