【问题标题】:Filtering & sorting by dates in MongoDB's oplog在 MongoDB 的 oplog 中按日期过滤和排序
【发布时间】:2015-02-14 18:55:53
【问题描述】:

我正在尝试过滤 oplog.rs 以查看在某个日期之后记录的操作。但比较运算符似乎不适用于 MongoDB 中的日期:

db['oplog.rs'].find({ts: {$gte: ISODate("2014-12-15T00:00:00Z")}})

令人困惑的是,许多在线资源都说要这样做,但显然行不通。我想返回 ts 字段至少为 12 月 15 日或更近的结果,但我得到的结果明显早于此期间。如果我用 $lte 切换 $gte 则根本不会显示任何结果,即使在此指定日期之前和之后肯定有条目。

另外,我似乎也无法对结果进行排序。如果我试试这个:

db['oplog.rs'].find().sort({ts: -1})

我明白了:

error: {
    "$err" : "Runner error: Overflow sort stage buffered data usage of 33566005 bytes exceeds internal limit of 33554432 bytes",
    "code" : 17144
}

如果我可以过滤结果以使其更新,我希望它能克服这个排序错误,但我什至无法使用 MongoDB 的基本运算符来做到这一点。如何按日期过滤查找操作的结果?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    比较运算符可以很好地处理日期,但 tsTimestamp 对象 - 不是日期。

    您的查询需要如下所示:

    db['oplog.rs'].find({ts: {$gte: Timestamp(ISODate("2014-12-15T00:00:00Z").getTime(),0)}})
    

    这会基于 ISODate 创建一个 Timestamp 对象并在查询中使用它。

    【讨论】:

    • 感谢您指出这是一个时间戳!我不知道我怎么忽略了那个。但是,当您除以 1000 时,它仍然显示此日期之前的结果,但如果我取出 /1000,它会正确显示 12 月 15 日之后的结果。
    • 好的,不除以 1000 导致我的测试出现异常,但如果对你有用 :)
    • 为什么你使用 inc=0时间,公司)。
    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多