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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongoose / MongoDB:获得倒数第二个文档相关的知识,希望对你有一定的参考价值。

我怎样才能使用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!');
            }
        });

这只返回集合中的LATEST文档。我需要在最新版本之前使用一个,所以从这一个之前的一天开始,我怎么能够做到这一点?

答案

然后你必须使用聚合:

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之前添加匹配

EG

db.getCollection('data').aggregate([
  { $match: {...}},
  { $sort: {"date": -1}},
  { $limit: 2},
  { $sort: {"date": 1}},
  { $limit: 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,这应该会给你想要的结果。

另一答案

这是我用来使它适用于我想要的修复,希望它能帮助其他人:

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

码:

const moment = require('moment');

...

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

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

Mongoose 从对象数组中查询倒数第二个项目

Mongoose 应用 随笔

如何在 MongoDB 中对聚合查询结果进行分页并获得总文档数(Node.js + Mongoose)?

NodeJS连接MongoDB和mongoose

MongoDB 聚合与 Mongoose 虚拟

Node 使用mongodb的mongoose是否很坑