【问题标题】:How to get data between the two dates from mongodb using mongoose如何使用 mongoose 从 mongodb 获取两个日期之间的数据
【发布时间】:2020-09-26 15:43:06
【问题描述】:

我的问题很简单。试图在两个日期之间从 mongodb 获取记录,例如 [01-06-2020 到 07-06-2020]。但不起作用。怎么做?

日期格式为 dd-mm-yyyy

mongodb 记录:

[
{ 
_id:ObjectId("5edd1df67b272e2d4cf36f70"),
 date:"01-06-2020", 
 pid:1,
 pname:"Micheck" 
},
{ 
_id:ObjectId("5edd1dk67b272e2d4cf31f72"),
 date:"03-06-2020", 
 pid:2,
 pname:"Zohn" 
},
{ 
_id:ObjectId("5edd1rf67b272e2d4cf16f73"),
 date:"07-06-2020", 
 pid:3,
 pname:"Robert" 
},
{ 
_id:ObjectId("5edd1dw67b272e2d4cf76f76"),
 date:"01-05-2020", 
 pid:6,
 pname:"Josebh" 
}
]

data.controller.js:

module.exports.getReportTableData = (req, res, next) => {
    let collectionname = req.query.collection; 

    let date1 = "01-06-2020"; //dd-mm-yyyy
    let date2 = "07-06-2020"; //dd-mm-yyyy

    let tableReportdata = dbc.model(collectionname);
    tableReportdata.find({ date: date1,date2 }, function(err, docs) {
        if (err) {
            console.log(err);
            return;
        } else {
            console.log("Successful loaded data");
            res.json({ data: docs, success: true, msg: 'Data loaded.' });
        }
    });
};

【问题讨论】:

  • 你的 mongo 版本是什么?
  • @AyushGupta:4.2.7
  • 并不是说如果您可以更改架构以使日期为“yyyy-mm-dd”,您可以随意查询并对字符串进行排序。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

此解决方案需要 Mongo 服务器版本 > 4.0.0

根据 OP 的评论,他使用的是 4.2.7 版

Mongo 当前将您的字段视为字符串,而不是日期,因此首先您必须将它们转换为日期。

我建议在写入数据库时​​将字段类型更改为日期,或者添加具有日期类型的新字段以获得更好的性能和更少的开销

要在运行时进行此转换,您必须将聚合管道与 addFields dateFromString match gtelte 运算符一起使用。

您的代码应如下所示:

let date1 = new Date("2020-06-01T00:00:00.000Z"); // date objects
let date2 = new Date("2020-06-07T00:00:00.000Z");

let tableReportdata = dbc.model(collectionname);
tableReportdata.aggregate([{
        $addFields: {
            convertedDate: {
                $dateFromString: {
                    dateString: "$date",
                    format: "%d-%m-%Y",
                    timezone: "UTC"
                }
            }
        }
    },
    {
        $match: {
            convertedDate: {
                $gte: date1,
                $lte: date2,

            }
        }
    }
], function(err, docs) {
    if (err) {
        console.log(err);
        return;
    } else {
        console.log("Successful loaded data");
        res.json({
            data: docs,
            success: true,
            msg: 'Data loaded.'
        });
    }
});

Playground Link

【讨论】:

  • 我可以这样使用吗?让 date1 = new Date("01-06-2020"); // 日期对象 let date2 = new Date("07-06-2020");
  • 不,这将被视为MM-DD-YYYY,至少在 chrome 和 V8 中
  • @PappaS 另外最好明确时间和时区
  • 我存储在数据库中的日期就像字符串一样。我无法更改类型
  • 如何显式?
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2020-09-27
  • 2013-10-19
  • 1970-01-01
  • 2016-08-09
  • 2019-04-19
相关资源
最近更新 更多