Подтвердить что ты не робот

Получение массива идентификаторов в Mongoid

как вы извлекаете массив IDs в Mongoid?

arr=["id1","id2"]
User.where(:id=>arr)

Вы можете сделать это легко, если вы извлекаете другой атрибут

User.where(:nickname.in=>["kk","ll"])

Но мне интересно, как это сделать в mongoid → это должна быть очень простая и обычная операция

4b9b3361

Ответ 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']}