如何获得此数组中的唯一元素?


71

使用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。有人知道如何实现吗?

Answers:


191

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

ary.uniq{|x| x.user_id}

这将返回一个具有唯一性user_ids的集合。


19
这是解决OP问题的一种快速解决方案,但从长远来看,建议您仔细研究所有数据,然后对其进行迭代以删除重复项。这将消耗不必要的资源。更好的解决方案是让OP使用更智能的查询来消除重复信息,或者使用集合类型消除其本质。
Tin Man 2010年

4
@Greg:是的,我同意,但是请确保您也没有进行过早的优化...
Peter

17
这还不成熟,有30多年处理数据库的经验。
Tin Man 2010年

@Peter它返回一个数组而不是一个Set。参见ruby-doc.org/core-2.2.0/Array.html
Ryan Rapp

15

这应该为您工作:

考虑到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 



2

除了使用Array之外,还可以考虑使用HashSet

集的行为类似于数组,只是集仅包含唯一值,并且在幕后基于哈希值构建。与数组不同,集合不保留将项目放入其中的顺序。哈希也不会保留顺序,但是可以通过密钥进行访问,因此您不必遍历哈希即可查找特定项目。

我更喜欢使用哈希。在您的应用程序中,user_id可以是键,而值是整个对象。这将自动从哈希中删除所有重复项。

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


从Ruby 1.9的NB开始,将保留哈希值的顺序,因此我假设是集合。如果我在后者上错了,很高兴得到纠正。
SRack

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 %>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.