2010-11-23 89 views
62

使用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。任何人都知道這可以實現嗎?

回答

174

您可以使用方法uniq。假設你的數組是ary,請致電:

ary.uniq{|x| x.user_id} 

,這將返回一組具有獨特user_id秒。

+18

這是解決OP問題的一個快速解決方案,但從長遠來看,它會鼓勵所有數據在其中迭代,然後重複刪除重複數據。這將消耗更多的資源。更好的解決方案是讓OP使用更聰明的查詢來預先消除模糊,或者使用集合類型來消除它們的本質。 – 2010-11-23 05:35:03

1

而不是使用陣列,請考慮使用HashSet

集合的行爲與Array相似,只是它們只包含唯一值,並且在封面下以Hashes爲基礎構建。與數組不同,集合不保留項目放入它們的順序。哈希不保留順序,但可以通過一個鍵訪問,所以你不必遍歷哈希來找到一個特定的項目。

我贊成使用Hashes。在您的應用程序中,user_id可能是鍵,值將是整個對象。這將自動刪除哈希中的任何重複。

或者,只從數據庫中提取唯一值,如John Ballinger所建議的。

0

錯誤,在視圖中有點混亂。但我想我已經得到了它與這應該工作組(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 %> 
15

工作您:

考慮表格1的名稱爲活動的列可能在多個記錄中具有相同的值。這就是你將如何提取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 
10

對於那些達不到這個了在未來,你現在可以使用從原產地Mongoid::Criteria#distinct方法從數據庫中選擇唯一不同的值:

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

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

相關問題