70 votes

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

En utilisant Mongoid. Malheureusement, Mongoid ne permet pas de sélectionner "unique / distrinct" ! J'ai obtenu ces résultats. Comme vous pouvez le voir, 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 este Je me suis dit que je pourrais faire quelque chose de similaire et que mon tableau ressemblerait 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 m'inquiète pas de la combinaison de résultats qui est extraite. Tant que j'ai des user_id uniques dans l'ensemble des résultats. Quelqu'un sait comment y parvenir ?

187voto

Peter Points 38320

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 des user_id s.

15voto

ajmartin Points 726

Cela devrait fonctionner pour vous :

Considérons que la Table1 a une colonne du nom de activité qui peut avoir la même valeur dans plus d'un enregistrement. C'est ainsi que vous allez extraire UNIQUEMENT les entrées uniques de activité dans le tableau 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

11voto

xiy Points 535

Pour les futurs utilisateurs, vous pouvez désormais utiliser l'option Mongoid::Criteria#distinct d'Origin pour ne sélectionner que des valeurs distinctes dans 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)

8voto

John Ballinger Points 4193

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("zip-code") ;

2voto

the Tin Man Points 69148

Au lieu d'utiliser un tableau, envisagez d'utiliser soit un Hash ou un Définir .

Les ensembles se comportent de la même manière qu'un tableau, à ceci près qu'ils ne contiennent que des valeurs uniques et que, en apparence, ils sont construits sur des hachages. Contrairement aux tableaux, les ensembles ne conservent pas l'ordre dans lequel les éléments y sont placés. Les hachages ne conservent pas non plus l'ordre mais sont accessibles via une clé, ce qui évite de devoir parcourir le hachage pour trouver un élément particulier.

Je préfère utiliser des hachages. Dans votre application, le user_id pourrait être la clé et la valeur serait l'objet entier. Cela supprimera automatiquement tous les doublons du hachage.

Ou bien, n'extrayez que les valeurs uniques de la base de données, comme l'a suggéré John Ballinger.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X