【问题标题】:Querying date range in aggregate query returns nothing or ignores dates在聚合查询中查询日期范围不返回任何内容或忽略日期
【发布时间】:2019-11-13 03:25:14
【问题描述】:

在我的聚合查询中,我尝试在 $match 语句中添加条件以仅返回给定日期范围内的记录。如果不转换为 ISOString,我会得到一组完全忽略日期范围的记录。当我转换为 ISOString 时,我什么也得不到(返回空集)。我已经尝试使用 $and 运算符,仍然没有。

我已经尝试了堆栈上的所有解决方案,但均无济于事。这是我的代码:

$match: { 
            $and: [
                {'author.id': { $ne: req.user._id }},
                {'blurtDate': { $gte: test1.toISOString() }},
                {'blurtDate': { $lte: test2.toISOString() }}
            ]
        }

test1 和 test2 是正确的,我在控制台日志中检查了它们,它们反映如下:

2019-06-02T12:44:39.000Z -- 2019-07-02T12:44:39.928Z

我也尝试过不使用 $and 运算符:

$match: { 
            'author.id': { $ne: req.user._id },
            'blurtDate': { $gte: test1.toISOString() },
            'blurtDate': { $lte: test2.toISOString() } 
        }

这又没有返回任何东西。非常感谢任何帮助!

编辑:想强调 test1 和 test2 是新的日期对象:

test1 = new Date(qryDateFrom);  //Tried .toISOString() as well
test2 = new Date(qryDateTo);

如果没有 .toISOString(),我会返回忽略日期的值。使用 .toISOString 我得到一个空返回。

这是一个应该返回的示例文档:

{
    "_id" : ObjectId("5d0a807345c85d00ac4b7217"),
    "text" : "<p>Seriously RV style.</p>",
    "blurtDate" : ISODate("2019-06-19T18:35:31.156Z"),
    "blurtImg" : "04643410-92c1-11e9-80b6-a3262311afff.png",
    "vote" : 0,
    "author" : {
        "id" : ObjectId("5cb5df0ef7a3570bb4ac6e05"),
        "name" : "Benjamin Paine"
    },
    "__v" : 0
}

当我删除 .toISOString() 时,我得到的文档超出了预期的日期范围,例如 5 月的这个(查询应该只在 6 月 2 日到 7 月 2 日之间返回)。

{
    "_id" : ObjectId("5d07ebaf9a035117e4546349"),
    "text" : "<p>A start to something more...</p>",
    "blurtDate" : ISODate("2019-05-15T19:36:15.737Z"),
    "blurtImg" : "2be7a160-9137-11e9-933f-6966b2e503c7.png",
    "vote" : 0,
    "author" : {
        "id" : ObjectId("5cb5df0ef7a3570bb4ac6e05"),
        "name" : "Benjamin Paine"
    },
    "__v" : 0
}

【问题讨论】:

  • @JohnnyHK 当然!我在底部添加了它。
  • @JohnnyHK 问题是,当我删除 .toISOString() 时,我得到的结果超出了日期范围。例如,对于我在问题中发布的给定日期范围,将返回具有此日期的文档:“blurtDate”:ISODate(“2019-05-15T19:36:15.737Z”),即 5 月。而查询范围在 6 月 2 日到 7 月 2 日之间。
  • @JohnnyHK 这行得通!你说的一切都是正确的。我不需要 .toISOString 并且我结合了这两个运算符。谢谢!如果您愿意,请添加为答案,我将标记为解决方案。

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

您的文档包含实际的 Date 对象,因此请从您的查询中删除 .toISOString()s。但您还需要将您的 $gte$lte 术语组合成一个对象:

$match: { 
    'author.id': { $ne: req.user._id },
    'blurtDate': { $gte: test1, $lte: test2 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多