【问题标题】:How to output mongoose/mongodb query with date fields that print strings with specific format?如何使用打印特定格式字符串的日期字段输出 mongoose/mongodb 查询?
【发布时间】:2016-09-28 23:14:38
【问题描述】:

我正在通过 mongoose 向 mongoDB 查询一些具有 Date 类型字段的项目。

我正在传递此查询的结果以表达为网络响应。在某个地方,这个Date 正在被转换为字符串。输出为"2016-09-28T03:19:51.066Z"

我想选择这个字符串的格式。为了一个具体的例子,假设我想要的只是Date.getFullYear()。这应该返回 "2016" 而不是 "2016-09-28T03:19:51.066Z"

遍历查询结果不是解决方案。

我尝试使用带有一些架构选项的猫鼬虚拟方法无济于事。我找不到任何可以拦截此 Date 字段的字符串化的内容。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    为此,您可以使用聚合运算符$dateToString

    做一些类似的事情:

    db.table.aggregate(
       [
         {
           $project: {
              fullYear: { $dateToString: { format: "%Y", date: "$date" } }
           }
         }
       ]
    )
    

    其中 $date 是您的日期字段。

    如果你只是想在你的前端像 year 一样,你也可以覆盖 toJSON 方法和 date.getFullYear() 那里。

    在您的模型中包含以下内容:

    YourSchema.set('toJSON', {
        transform: function (doc, ret, options) {
            if (ret.date) {
              ret.date = ret.date.getFullYear();
            }
    
            return ret;
        }
    });
    

    当你向模型中添加一个字段时,你必须保持这一点,你必须将它包含在 toJson 中,否则它不会被包含;-)

    【讨论】:

    • 我正在检查聚合,但它似乎是错误的工具,并且比我认为的解决方案更复杂。覆盖 toJSON 也不是完全正确的事情,除非我缺少一些额外的魔法。查询可以选择特定字段,您可以有多个日期字段,但只希望更改特定的一个。你如何在保持 O(1) 的同时让一个特定的“日期”字段正确输出?
    • 好吧聚合工具没错,它是mongodb的一个非常强大的功能,我会在我的答案中添加一个toJson示例
    • 这个 toJSON 是正确的,直到你帮助我才得到它!我更改的一件事是保留 ret 并仅更改我需要的字段,因此我不担心其他字段或查询中的内容:let date = ret.date; if (date) { ret.date = date.getFullYear(); }
    • 无论如何都可以使用查找查询自定义格式日期
    • @shankarmsr 你能澄清你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    相关资源
    最近更新 更多