Mongoid регулярное выражение для элемента в массиве - PullRequest
2 голосов
/ 21 мая 2011

У меня есть две модели: пользователь и встроенная модель. Сообщение

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/ })

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Если вы имеете дело с массивом, вы используете "in".

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

должно работать, если я не ошибаюсь.

Alex

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

Теперь у вас есть свои сообщения, и вы можете делать что угодно, но вы не можете получить коллекции сообщений для всех пользователей, это не работает таким образом.

0 голосов
/ 25 мая 2011

Ваш прямой запрос Mongo находит все пользовательские документы, которые имеют встроенные сообщения с указанной подходящей подстрокой.Похоже, что цель вашего запроса Mongoid - найти соответствующее сообщение в уже возвращенном пользовательском документе.Я не уверен, какое поведение вы ищете, но если вы хотите выполнить тот же запрос Mongo-direct в Mongoid, он будет выглядеть примерно так:

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