如何在此数组中获取唯一元素?

时间:2010-11-23 02:21:25

标签: ruby-on-rails ruby

使用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')>
] 

我在看this,并且认为我可以做类似的事情,以便我的数组现在看起来像这样:

[
  #<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 个答案:

答案 0 :(得分:182)

您可以使用方法uniq。假设您的数组为ary,请致电:

ary.uniq{|x| x.user_id}

这将返回一个包含唯一user_id s。

的集合

答案 1 :(得分:15)

这应该适合你:

考虑Table1有一个名为 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 

答案 2 :(得分:11)

对于那些在未来发生这种情况的人,您现在可以使用Origin的Mongoid::Criteria#distinct方法从数据库中仅选择不同的值:

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

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

答案 3 :(得分:8)

你看过这个页面吗?

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

这可能会节省你一些时间吗?

例如 db.addresses.distinct( “邮政编码”);

答案 4 :(得分:2)

请考虑使用HashSet,而不是使用数组。

集合的行为类似于数组,只有它们只包含唯一值,并且在封面下构建在哈希上。与数组不同,集合不保留项目的顺序。哈希不会保留订单,但可以通过密钥访问,因此您不必遍历哈希以查找特定项目。

我赞成使用哈希。在您的应用程序中,user_id可以是键,值将是整个对象。这将自动从散列中删除任何重复项。

或者,只从数据库中提取唯一值,就像John Ballinger建议的那样。

答案 5 :(得分:0)

Errr,视图中有点乱。但我想我已经与团队合作了(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 %>