Mongoose/MongoDB:获取倒数第二个文档
Mongoose/MongoDB: Get second to last document
我如何使用 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!');
}
});
这只是 returns 集合中的最新文档。相反,我需要最新版本之前的版本,所以这是前一天的版本,我该怎么做?
你可以这样做:
data
.find()
.limit(2)
.sort({ "_id": -1 })
.exec(function(err, data) {
if (err) return res.json(err);
return res.json(data);
});
这将在所有按 id 排序的文档上查找:-1,然后将结果限制为两个,这应该会给您想要的结果。
那么你必须使用聚合:
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}
])
这是我用来使它达到我想要的效果的修复程序,希望它能帮助其他人:
我决定导入 MomentJS,从那里它显示当前日期,从中减去 1,以显示前一个日期的值,从而为我提供前一天的正确集合。
代码:
const moment = require('moment');
...
data.find({"updated": moment().subtract(1, 'days').format('L')}) ...
获取倒数前的第二个
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 获取第二天到最近或前一天的文档集合?
我获取最新数据的代码如下:
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!');
}
});
这只是 returns 集合中的最新文档。相反,我需要最新版本之前的版本,所以这是前一天的版本,我该怎么做?
你可以这样做:
data
.find()
.limit(2)
.sort({ "_id": -1 })
.exec(function(err, data) {
if (err) return res.json(err);
return res.json(data);
});
这将在所有按 id 排序的文档上查找:-1,然后将结果限制为两个,这应该会给您想要的结果。
那么你必须使用聚合:
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}
])
这是我用来使它达到我想要的效果的修复程序,希望它能帮助其他人:
我决定导入 MomentJS,从那里它显示当前日期,从中减去 1,以显示前一个日期的值,从而为我提供前一天的正确集合。
代码:
const moment = require('moment');
...
data.find({"updated": moment().subtract(1, 'days').format('L')}) ...
获取倒数前的第二个
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!');
}
});