【问题标题】:Mongoose/MongoDB: Get second to last documentMongoose/MongoDB:获取倒数第二个文档
【发布时间】: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!');
            }
        });

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

【问题讨论】:

    标签: node.js mongodb express mongoose mean-stack


    【解决方案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!');
                    }
                });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-20
          • 1970-01-01
          • 2023-03-03
          • 2023-01-17
          • 2011-11-10
          • 1970-01-01
          • 2022-08-09
          • 1970-01-01
          相关资源
          最近更新 更多