web-dev-qa-db-fra.com

Comment obtenir des éléments uniques dans ce tableau?

Utiliser Mongoid. Malheureusement, Mongoid ne permet pas de sélectionner unique/distinct! Ont obtenu ces résultats. Comme vous pouvez le constater, il y a 7 résultats Si vous regardez attentivement (à user_id), il n'y a que 2 utilisateurs.

[
  #<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')>
] 

Je regardais this et pensais que je pourrais faire quelque chose de similaire pour que mon tableau ressemble maintenant à ceci:

[
  #<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')>
]

Je ne suis pas concerné par la combinaison de résultats qui est extraite. Tant que j'ai unique user_id dans le jeu de résultats. Quelqu'un sait comment cela peut être réalisé?

65
Christian Fazzini

Vous pouvez simplement utiliser la méthode uniq. En supposant que votre tableau est ary, appelez:

ary.uniq{|x| x.user_id}

et cela retournera un ensemble avec user_ids unique.

180
Peter

Cela devrait fonctionner pour vous:

Considérez Table1 avec une colonne portant le nom de activity qui peut avoir la même valeur dans plusieurs enregistrements. Voici comment vous allez extraire UNIQUEMENT les entrées uniques de activity field dans 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 
15
ajmartin

Pour ceux qui rencontrent ce problème à l'avenir, vous pouvez maintenant utiliser la méthode Mongoid::Criteria#distinct de Origin pour sélectionner uniquement des valeurs distinctes de la base de données:

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

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

11
xiy

Avez-vous regardé cette page?

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

Cela pourrait vous faire gagner du temps? 

par exemple db.addresses.distinct ("Code postal");

8
John Ballinger

Au lieu d'utiliser un tableau, envisagez d'utiliser un Hash ou un Set .

Les ensembles se comportent comme un tableau, mais ils ne contiennent que des valeurs uniques et, sous les couvertures, sont construits sur des hachages. Les ensembles ne conservent pas l'ordre dans lequel les éléments sont placés contrairement aux tableaux. Les hachages ne conservent pas la commande non plus, mais sont accessibles via une clé afin que vous n'ayez pas à parcourir le hachage pour trouver un élément particulier.

Je préfère utiliser Hash. Dans votre application, id_utilisateur pourrait être la clé et la valeur, tout l'objet. Cela supprimera automatiquement tous les doublons du hachage.

Vous pouvez également n’extraire que des valeurs uniques de la base de données, comme l’a suggéré John Ballinger.

2
the Tin Man

Euh, c'est un peu brouillon dans la vue. Mais je pense que je l’ai obtenu pour travailler avec le groupe (http://mongoid.org/docs/querying/)

Manette

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

Vue

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