Получение массива идентификаторов в Mongoid
как вы извлекаете массив IDs
в Mongoid
?
arr=["id1","id2"]
User.where(:id=>arr)
Вы можете сделать это легко, если вы извлекаете другой атрибут
User.where(:nickname.in=>["kk","ll"])
Но мне интересно, как это сделать в mongoid → это должна быть очень простая и обычная операция
Ответы
Ответ 1
Помните, что идентификатор хранится как :_id
а не :id
. Существует вспомогательный метод id
, но когда вы делаете запросы, вы должны использовать :_id
:
User.where(:_id.in => arr)
Мне часто бывает полезно получить список идентификаторов для выполнения сложных запросов, поэтому я делаю что-то вроде:
user_ids = User.only(:_id).where(:foo => :bar).distinct(:_id)
Post.where(:user_id.in => user_ids)
Ответ 2
Или просто:
arr = ['id1', 'id2', 'id3']
User.find(arr)
Ответ 3
Вышеуказанный метод, предложенный браузерами, кажется, больше не работает, по крайней мере для меня. Что я делаю:
User.criteria.id(arr)
Ответ 4
user_ids = User.only(:_id).where(:foo => :bar).map(&:_id)
Post.where(:user_id.in => user_ids)
Решение выше отлично работает, когда количество пользователей невелико. Но для этого потребуется много памяти, в то время как тысячи пользователей.
User.only(:_id).where(:foo => :bar).map(&:_id)
создаст список объектов пользователя с нулем в каждом поле, кроме id.
Решение (для монгоида 2.5):
User.collection.master.where(:foo => :bar).to_a.map {|o| o['_id']}