Как получить уникальные элементы в этом массиве? - PullRequest
68 голосов
/ 23 ноября 2010

Использование Mongoid.К сожалению, Mongoid не позволяет выбрать уникальный / отличный!Получили эти результаты.Как видите, есть 7 результатов.Если вы посмотрите внимательно (на user_id), есть только 2 пользователя.

[
  #<Activity _id: 4cea6c4572357e00fa00011a, created_at: 2010-11-22 13:12:37 UTC, updated_at: 2010-11-22 13:12:37 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea6c3072357e00fa000116, created_at: 2010-11-22 13:12:16 UTC, updated_at: 2010-11-22 13:12:16 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea6bdd72357e00fa00010d, created_at: 2010-11-22 13:10:53 UTC, updated_at: 2010-11-22 13:10:53 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea46df72357e00fa0000a4, created_at: 2010-11-22 10:33:03 UTC, updated_at: 2010-11-22 10:33:03 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea40c572357e00fa00006f, created_at: 2010-11-22 10:07:01 UTC, updated_at: 2010-11-22 10:07:01 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea3c8b72357e00fa00005e')>, 
  #<Activity _id: 4cea3ca172357e00fa000062, created_at: 2010-11-22 09:49:21 UTC, updated_at: 2010-11-22 09:49:21 UTC, action: "Attend", user_id: BSON::ObjectId('4cea39b772357e00fa000046'), artist_id: nil, media_id: BSON::ObjectId('4cea3c8b72357e00fa00005e')>, 
  #<Activity _id: 4cea344a72357e00fa00003f, created_at: 2010-11-22 09:13:46 UTC, updated_at: 2010-11-22 09:13:46 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea306c72357e00fa000031')>
] 

Я смотрел на это и думал, что могу сделать что-то подобное, чтобы мой массив теперьвыглядеть так:

[
  #<Activity _id: 4cea6c4572357e00fa00011a, created_at: 2010-11-22 13:12:37 UTC, updated_at: 2010-11-22 13:12:37 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea3ca172357e00fa000062, created_at: 2010-11-22 09:49:21 UTC, updated_at: 2010-11-22 09:49:21 UTC, action: "Attend", user_id: BSON::ObjectId('4cea39b772357e00fa000046'), artist_id: nil, media_id: BSON::ObjectId('4cea3c8b72357e00fa00005e')>
]

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

Ответы [ 6 ]

183 голосов
/ 23 ноября 2010

Вы можете просто использовать метод uniq.Предполагая, что ваш массив ary, вызовите:

ary.uniq{|x| x.user_id}

, и это вернет набор с уникальным user_id s.

15 голосов
/ 23 ноября 2010

Это должно работать для вас:

Учтите, что в таблице 1 есть столбец с именем активность , который может иметь одинаковое значение в нескольких записях.Таким образом вы извлечете ТОЛЬКО уникальные записи поля activity в Table1.

#An array of multiple data entries
@table1 = Table1.find(:all) 

#extracts **activity** for each entry in the array @table1, and returns only the ones which are unique 

@unique_activities = @table1.map{|t| t.activity}.uniq 
11 голосов
/ 03 апреля 2013

Для тех, кто воспользуется этим в будущем, теперь вы можете использовать метод Mongoid::Criteria#distinct из источника, чтобы выбрать только отдельные значения из базы данных:

# Requires a Mongoid::Criteria
Attendees.all.distinct(:user_id)

http://mongoid.org/en/mongoid/docs/querying.html (v3.1.0)

8 голосов
/ 23 ноября 2010

Вы смотрели на эту страницу?

http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct

Это может сэкономить вам время?

например, db.addresses.distinct ("почтовый индекс");

2 голосов
/ 23 ноября 2010

Вместо использования массива рассмотрите возможность использования Hash или Set .

Наборы ведут себя подобно Массиву, только они содержат только уникальные значения, и, под крышками, построены на Хешах. Наборы не сохраняют порядок, в который элементы помещаются в них, в отличие от массивов. Хэши также не сохраняют порядок, но к ним можно получить доступ с помощью ключа, поэтому вам не нужно просматривать хеш, чтобы найти конкретный элемент.

Я предпочитаю использовать Хеши. В вашем приложении user_id может быть ключом, а значением будет весь объект. Это автоматически удалит все дубликаты из хеша.

Или извлекать только уникальные значения из базы данных, как предложил Джон Баллинджер.

0 голосов
/ 23 ноября 2010

Errr, это немного грязно в представлении. Но я думаю, что получил его для работы с группой (http://mongoid.org/docs/querying/)

Контроллер

@event_attendees = Activity.only(:user_id).where(:action => 'Attend').order_by(:created_at.desc).group

View

<% @event_attendees.each do |event_attendee| %>    
  <%= event_attendee['group'].first.user.first_name %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...