2012-06-19 5 views
5

Я очень расстроен, поскольку я пытаюсь запросить результаты монгольских критериев и хранить только документы, в которых поле отличается. И при этом:Как получить отличные результаты от монгольских критериев?

Books.all.distinct(:name) 

... только возвращает поля имени, а не документы.

Также использование петли uniq, как указано в другом вопросе, здесь не работает.

Books.all.uniq{|x| x.name} # Returns non-unique results 

Что мне здесь не хватает?

+0

Есть ли способ сделать это в слое базы данных, вместо того, чтобы фильтровать его в Ruby? – Avishai

ответ

0

Я не уверен, что полностью понимаю, чего вы пытаетесь достичь? Есть ли в поле «имя» в вашей базе данных уникальное ограничение?

Если это так, вы просто извлекаете все имена книг, чтобы получить сами книги, которые вы бы назвали базовым объектом.

Если нет, для каждого имени будет несколько книг, что не имеет смысла захватывать отдельными. Возможно, что вы ищете функцию groupby? Чтобы сгруппировать все книги с таким же именем, вы можете позвонить Books.all.group_by{|book| book.name}, но поскольку это выполняется против веб-сервера, а не на уровне базы данных, он будет очень медленным для любого разумного количества записей.

Лучше всего, вероятно, чтобы сделать одно из следующих действий:

  • Использование карты/уменьшения, как указано в ответе на этот вопрос: Mongoid Group By or MongoDb group by in rails
  • Посмотрите в новые рамки агрегации выпущенном в 2,2 - см http://docs.mongodb.org/manual/applications/aggregation/ Примечание: на момент написания этого не поддерживается Mongoid, и будет принимать какую-то работу, чтобы получить движение
0

OP, ваша проблема в том, что вы хотите каждую книгу с уникальным именем.

Эта проблема с этим состоит в том, что позволяет сказать, что у вас есть 98 уникальных книг и 2 книги с таким же названием

Если вы обратитесь к базе данных: «Дайте мне каждый с уникальным именем книгу» Это будет найти первые 98 книг , то он столкнется с последними двумя.

Какую из двух книг с тем же именем следует вернуть? Поскольку нет правильного ответа на этот вопрос, учитывая уровень детализации, что-то вроде гипотетического .uniq не имеет смысла.

Смежные вопросы