Получение массива идентификаторов в Mongoid - PullRequest
25 голосов
/ 08 декабря 2010

как вы получаете массив IDs в Mongoid?

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

Это легко сделать, если вы получаете другой атрибут

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

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

Ответы [ 4 ]

43 голосов
/ 08 декабря 2010

Помните, что идентификатор хранится как :_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)
5 голосов
/ 19 мая 2011

Или просто:

arr = ['id1', 'id2', 'id3']
User.find(arr)
4 голосов
/ 21 января 2011

Вышеупомянутый метод, предложенный browsersenior, похоже, больше не работает, по крайней мере, для меня. Что я делаю:

User.criteria.id(arr)
2 голосов
/ 16 октября 2012
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)

создаст список объектов User с nil в каждом поле, кроме id.

Решение (для mongoid 2.5):

User.collection.master.where(:foo => :bar).to_a.map {|o| o['_id']}
...