Как получить уникальные элементы в этом массиве?


С Помощью 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 63

6 ответов:

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

ary.uniq{|x| x.user_id}

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

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

рассмотрим Table1 имеет столбец с именем активность которые могут иметь одинаковое значение в нескольких записях. Вот как вы будете извлекать только уникальные записи активность поле в Таблице 1.

#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 

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

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

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

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

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

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

например децибел.адреса.distinct ("почтовый индекс");

вместо использования массива, рассмотрите возможность использования либо a хэш или Set.

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

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

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

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

контроллер

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

посмотреть

<% @event_attendees.each do |event_attendee| %>    
  <%= event_attendee['group'].first.user.first_name %>
<% end %>