使用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。有谁知道如何实现这一目标?
答案 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)
答案 3 :(得分:8)
你看过这个页面吗?
http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct
这可能会节省你一些时间吗?
例如 db.addresses.distinct( “邮政编码”);
答案 4 :(得分:2)
集合的行为类似于数组,只有它们只包含唯一值,并且在封面下构建在哈希上。与数组不同,集合不保留项目的顺序。哈希不会保留订单,但可以通过密钥访问,因此您不必遍历哈希以查找特定项目。
我赞成使用哈希。在您的应用程序中,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 %>