С MongoMapper, как я могу найти записи, где идентификатор не существует в другой таблице?


У меня есть две модели, User и Class. В MySQL я мог бы найти пользователей Не в классе с чем-то вроде:

SELECT * FROM Users WHERE id NOT IN (SELECT user_id FROM Classes)

Как я могу сделать нечто подобное с MongoMapper? Я был в состоянии в консоли Mongo с:

db.users.find({user_id:{$ne:db.classes.find({}, {user_id:1})}});
Но я не могу понять синтаксис, используя MongoMapper.
2 2

2 ответа:

Фрагмент Mongo, который вы опубликовали, - это два запроса. Эквивалент Монгомапера:

classy_users_ids = MyClass.fields(:user_id).find_each.map(&:user_id).uniq
classless_users  = User.where(:id.nin => classy_users_ids)

Если у вас много пользователей, первый запрос может быть более эффективным, если вы пропустите преобразование в MongoMapper::Document со следующим:

classy_users_ids = MyClass.collection.distinct(:user_id)

Если они связаны, как Class ... has_many :users, Вы можете напрямую сопоставить user_ids:

Class.where(:user_ids.ne => user.id)