【问题标题】:MongoDb/ Mongoose Aggregation Issue With Matching Date匹配日期的 MongoDb/Mongoose 聚合问题
【发布时间】:2019-04-15 06:07:47
【问题描述】:

我正在尝试使用 Mongoose/MongoDb 的聚合函数来匹配基于日期的文档。虽然我的聚合函数通过其他过滤器匹配文档,但它根本无法根据日期工作。我在下面分享我的代码。

"$match": {
    "createdAt": {"$lt": new Date()}
}

我尝试了各种不同的日期,从存储在我的 mongoDb 数据库中的 ISO 日期开始,但它们似乎都不起作用。我不知道这个问题的原因是什么。虽然我在网上广泛搜索,但我没有找到任何结论性的东西。在 mongoDb shell 上执行的相同查询工作正常,让我相信这可能是 Mongoose 及其投射日期的方式的问题。

这是我用来测试的数据

{
     "_id" : ObjectId("5be7fc909625592852d422b4"),
     "time" : ISODate("2018-11-11T09:55:28.704Z"),
    "receiver" : ObjectId("5be5d727d3f24e06b144e229"),
    "createdAt" : ISODate("2018-11-11T09:55:28.718Z"),
    "updatedAt" : ISODate("2018-11-11T09:55:28.718Z"),
}
{
    "_id" : ObjectId("5be807902b789e5c3c05dc5e"),
    "time" : ISODate("2018-11-11T10:42:24.410Z"),
    "receiver" : ObjectId("5be5d727d3f24e06b144e229"),
    "createdAt" : ISODate("2018-10-09T18:30:00Z"),
    "updatedAt" : ISODate("2018-10-09T18:30:00Z"),
}

我被卡住了,不知道如何继续前进。根据我的理解,我已经尝试了所有方法,但似乎没有任何效果。我希望我能在这个问题上得到一些帮助。

非常感谢,谢谢。

【问题讨论】:

  • 请提供您的数据样本
  • 请检查编辑
  • 欢迎来到 SO。请校准“似乎不起作用”。你有错误吗?文件太多?还是没有?
  • 我的错。我的意思是“似乎不起作用”是聚合函数没有返回任何文档,即当我针对日期运行查询时没有匹配任何文档。

标签: mongodb date mongoose aggregate iso


【解决方案1】:

您可能面临时区问题。我刚刚在nodemongo 内部尝试了new Date().getTimezoneOffset() 的调用。两者都返回不同的结果(节点返回-60,mongo shell 在我的机器上返回0)。

您可以使用以下代码删除时区偏移:

let d = new Date()
var offset = d.getTimezoneOffset() * 60000 // This converts the given minutes to milliseconds.
var utc = d.getTime() + offset
var nd = new Date(utc)

"$match": {
    "createdAt": { "$lt": nd }
}

当您转换时间时,您现在应该得到预期的结果。

这是明智的,因为 MongoDB 使用 UTC 作为时间格式。在 vanilla JavaScript 中转换可能看起来有点麻烦。您也可以使用 moment.js 之类的库。

【讨论】:

  • 我昨天尝试了这个,但我仍然无法使用您共享的代码匹配文档。我确实从你所说的中得到了一个想法 - 并使用我的猫鼬模型在节点终端上测试了我的代码。令人惊讶的是,我能够在这里匹配条件,使用我共享的完全相同的查询。我怀疑这是我这边的问题,也许我选错了日期?我将不得不继续努力-但感谢您的帮助@mbuechmann
  • @DaminHan 您可以随时在任何日期值上调用toString()。或许通过这种方式,您可以找到相关的差异。
猜你喜欢
  • 2019-01-24
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 2018-04-16
  • 2022-12-01
  • 2015-06-28
  • 2014-05-25
相关资源
最近更新 更多