【问题标题】:MongoDB count() query returns outdated result in mongo shellMongoDB count() 查询在 mongo shell 中返回过时的结果
【发布时间】:2019-07-11 09:42:48
【问题描述】:

我的 MongoDB 集合中的文档非常频繁地更改状态字段。我可以很清楚地看到它,使用 mongoDB 客户端(Robo 3T)。

现在我想使用mongo shell 监控这个过程:

mongo --host=localhost db --eval "db.getCollection('events').find({status:'ACTIVE'}).count()"

这会返回一个正确的结果,但随后 mongoDB 会“缓存”它,并且在大约 10 秒内不会返回更新的结果。我需要每 200 毫秒更新一次。

来自 Robo 3T 的相同查询始终返回更新的结果,大约 5 毫秒。

根据我的观察,当负载较低时,每个请求都会更新 mongo shell 计数。

我在 MongoDB 文档中找不到任何类似缓存的机制信息。我怎样才能禁用它?为什么 Robo 3T 可以正常工作?

附言

我使用 python 脚本观察到相同的行为,该脚本使用 count() 查询轮询 mongo - 结果被缓存。但是一旦我开始在 Robo 3T 中执行查询,数字就开始在 python 和 mongo shell 中移动!发生了什么?

【问题讨论】:

    标签: mongodb mongo-shell robo3t


    【解决方案1】:

    尝试删除集合的所有缓存查询计划:

    db.collection.getPlanCache().clear()
    

    如果不更改 where 条件,更新将被缓存。

    文档:Plan cache

    【讨论】:

    • 行为是一样的。我认为这是意料之中的,因为此命令使查询计划无效,但计划相同是可以的。价值观是不断变化的,即使是相同的计划也会有所不同
    【解决方案2】:

    使用itcount(),它实际上在现有迭代器上执行查询。

    mongo --host=localhost db \
        --eval "db.getCollection('events').find({status:'ACTIVE'}).itcount()"
    

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 2014-05-05
      • 1970-01-01
      • 2017-07-19
      • 2016-07-12
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多