【问题标题】:Mongoid ruby where query returns incorrect results查询返回错误结果的 Mongoid ruby
【发布时间】:2020-10-01 14:39:53
【问题描述】:

我有一个嵌入许多消息的用户类。消息具有“源”字段。 我正在尝试获取带有特定“来源”的消息:

m = user.messages.where(source: 'reward').first

我得到零,因为没有。然后我自己添加一个,再次运行查询,但它仍然返回 nil。 当我这样做时: m = user.messages.to_a.find {|m| m.source == 'reward'}

它按预期工作。 似乎这里有一些缓存,在第一次查询之后,保留数据并忽略以下插入,但我找不到任何方法来禁用它(QueryCache 已禁用且不相关)。

会是什么?

【问题讨论】:

  • 您可以尝试运行 user.reload 然后再次运行查询吗?如果它有效,那么它可能是一个缓存问题。如果没有,那么我会假设嵌入对象的 where 实现中存在错误。
  • 如果我保存并重新加载它可以工作,但我更喜欢 to_a 解决方案。问题是为什么需要重新加载?这里使用什么缓存,如何防止?
  • 所以这证实了你怀疑这是一个缓存问题。我会在jira.mongodb.org/projects/MONGOID/issues 为 monoid 项目打开一个错误

标签: ruby mongoid


【解决方案1】:

对嵌入式关联的查询是在申请过程中完成的。如果加载了user,并且您使用加载的user 对象以外的任何对象(例如mongo shell 或Rails 控制台的不同实例)向该用户添加了更多消息,则加载的user 中的消息将不会更新.见https://docs.mongodb.com/mongoid/master/tutorials/mongoid-relations/#querying-loaded-associations

【讨论】:

  • 我正在使用同一控制台中的已加载用户将消息添加到已加载用户
【解决方案2】:

一种可能的解决方法是查询嵌入式关联。在您的情况下,您的查询将如下所示:

m = user.where('message.source' => 'reward').first

更多示例:https://docs.mongodb.com/mongoid/master/tutorials/mongoid-relations/index.html#querying-embedded-associations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多