【问题标题】:Mongoid regex for an element in Array数组中元素的 Mongoid 正则表达式
【发布时间】:2011-05-21 15:13:41
【问题描述】:

我有两个模型,一个用户模型和一个嵌入式模型消息

class User
  include Mongoid::Document
  embeds_many :messages
end

class Message
  include Mongoid::Document

  field :keywords, :type => Array
end

我正在尝试做类似的事情:

u = User.last
u.messages.where(:keywords => /sometext/).first

但这不会返回任何内容,如果字段不是Array 类型并且是String,则正则表达式似乎可以正常工作。我怎么能用 Mongoid 做这样的事情?

我还应该提到这个 Mongo 查询工作正常:

db.users.find({"messages.keywords" : /index/ })

【问题讨论】:

  • 您使用的似乎是mongoid。这是 MongoDB rub​​y​​ 驱动程序的包装器,并在它认为合适的时候输出它自己的查询。您有什么方法可以检查mongoid 实际运行的查询吗?和你跑的一样吗?
  • 所以我相信这实际上是 Mongoid 如何处理嵌入式模型的问题,如果我将消息模型拉入引用模型,则此查询可以正常工作。

标签: ruby-on-rails regex mongodb mongoid


【解决方案1】:

如果你正在处理一个数组,你使用“in”。

 users = User.where("messages.keywords".in => [/sometext/])

如果我没记错的话应该可以工作。

亚历克斯

User.where("messages.keywords".in => [/sometext/]).each do |user|
  message_collection_for_user = user.messages.where("keywords".in => [/sometext/])
end

现在您有了自己的消息并且可以做任何事情,但是您无法为所有用户获取消息的集合,这种方式无法正常工作。

【讨论】:

  • 这也会返回用户模型而不是消息模型
  • 这是正确的,但是由于您的模型消息嵌入在模型中,因此根本无法使用 mongodb 获取直接消息,这不是嵌入式文档的工作方式...请参阅编辑以获取它。
  • 如果你真的想要收集来自所有用户的消息,那么你不需要在用户中嵌入消息而是引用它。
【解决方案2】:

您的直接 Mongo 查询正在查找所有嵌入了带有指定匹配子字符串的消息的用户文档。看起来您的 Mongoid 查询的目的是在已返回的用户文档上查找匹配的消息。我不确定你在寻找哪种行为,但如果你想在 Mongoid 中执行相同的 Mongo-direct 查询,它看起来像这样:

users = User.where("messages.keywords" => /sometext/)

【讨论】:

  • 问题是我需要返回消息记录,而不是用户记录
猜你喜欢
  • 2017-06-18
  • 1970-01-01
  • 2017-10-16
  • 2020-06-01
  • 2016-12-08
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多