修改对象中的日期以在 mongoose 中进行聚合 $match 查询

Posted

技术标签:

【中文标题】修改对象中的日期以在 mongoose 中进行聚合 $match 查询【英文标题】:Modify date in object for aggregate $match query in mongoose 【发布时间】:2018-01-29 19:46:39 【问题描述】:

我将这个对象发送到node.js 应用程序中的控制器:

var req.body = 
"startDate": 
    "$gte": "1111-11-11T00:00:00.000Z",
    "$lte": "2017-08-17T00:00:00.000Z"


我想要一个函数,该函数将对该对象的 startDate 键进行操作并给我这个输出:

var req.body = 
"startDate": 
    "$gte": new Date("1111-11-11T00:00:00.000Z"),
    "$lte": new Date("2017-08-17T00:00:00.000Z")


我需要这种类型对象的原因是我使用mongoose 使用aggregate$match 使用此函数向mongoDB 发送查询:

var mongoose = require('mongoose');
var Activity = mongoose.model('Activity');
mongoose.set('debug', true);

var sendJSONresponse = function(res, status, content) 
res.status(status);
res.json(content);
; 

module.exports.readOther = function (req, res)

    Activity
        .aggregate([
            $match: req.body 
        ])
        .exec(function(err, output) 
            sendJSONresponse(res, 200, output);
    );
;

mongoose 要求指定日期类型new Date(,因此不会返回应用原始对象的文档。 mongoose 现在发送到服务器的查询(格式化为便于阅读)是:

Mongoose: activity.aggregate([ 
     '$match': 
         
            startDate:  '$gte': '1111-11-11T00:00:00.000Z', '$lte': '2017-08-17T00:00:00.000Z' 
        , 
], )

我尝试了以下方法来修改对象,但它只是将它变成了一个实际的日期,mongoose 没有正确处理

Object.keys(req.body.startDate).map(function (key) 
    req.body.startDate[key] = eval(new Date( req.body.startDate[key] ));
    return req.body.startDate;
  );

请帮助我使用请求的功能或建议另一种方法来让我查询日期范围。

【问题讨论】:

你不能让你的客户端发送正确的数据,而不是在服务器端打补丁吗? 你能不能简单地写这样的东西:req.body.startDate.$gte = new Date(req.body.startDate.$gte) 你试过在 MongoDB 上运行它吗? startDate 在您的架构中是如何定义的? 当我尝试使用new Date("1111-11-11T00:00:00.000Z") 转换日期时效果很好,如您所示。 【参考方案1】:

正如@dnickless 在 cmets 中所说,我需要插入

req.body.startDate.$gte = new Date(req.body.startDate.$gte)
req.body.startDate.$lte = new Date(req.body.startDate.$lte)

在我的mongoose 查询之前。

【讨论】:

以上是关于修改对象中的日期以在 mongoose 中进行聚合 $match 查询的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 聚合不按输入日期过滤

带有全文搜索和项目的 Mongoose 子字段聚合

在 mongoose 聚合中修改 $cond 的结果值?

如何设置 Mongoose 模式以在 MongoDB 中存储对象数组?

Mongoose:通过聚合获取对象数组的大小

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用