2010-08-29 5 views
0

j'ai mongo_mapper mis en place comme ceci:Suppression EmbeddedDocuments avec Mongo Mapper

class Person 
    include MongoMapper::Document 

    many :pets 
end 

class Pet 
    include MongoMapper::EmbeddedDocument 

    key :animal, String 
    key :name, String 
    key :colour, String 
end 

# Create a person 
me = Person.new 

# Add pets to the person 
me.pets << Pet.new(:animal => 'dog',:name => 'Mr. Woofs', :colour => 'golden') 
me.pets << Pet.new(:animal => 'cat', :name => 'Kitty', :colour => 'black') 
me.pets << Pet.new(:animal => 'cat', :name => 'Freckles', :colour => 'black') 
me.pets << Pet.new(:animal => 'cat', :name => 'Fluffy', :colour => 'tabby') 

Je sais que je peux supprimer tous les animaux de compagnie très simplement (me.pets fonctionne comme un tableau, mais appelle également de retour)

# Delete all pets 
me.pets.clear 

Je sais aussi que je pourrais supprimer tous les chats noirs en faisant ceci:

# Delete black cats 
me.pets.delete_if {|pet| pet.animal == 'cat' and pet.colour = 'black'} 

Mais cela semble comme si cela prenait beaucoup de temps s'il y avait un grand nombre d'animaux à parcourir.

Je pense qu'il devrait y avoir un moyen de sélectionner uniquement les chats noirs, puis clearce tableau à la place. Y a-t-il un tel moyen?

Répondre

0

essayer quelque chose comme ça, aucune idée si ça marche mais que ça vaut le coup.

me.pets.all(:animal => "cat", :colour => "black").clear 

Pour être honnête bien que je pense que vous vous inquiétez à ce sujet pour rien. Habituellement, la manipulation du tableau est très rapide.

+0

J'apprécie la réponse mais malheureusement: 'NoMethodError: méthode indéfinie 'all' for []: Array'. Je comprends que pour des collections comme celle-ci, l'itération sur un tableau ne prendra pas beaucoup de temps, mais je m'attends à traiter 10 000 documents imbriqués à la fois, et je ne devrai effacer que ~ 10 ! –

+1

JP, combien de temps diriez-vous qu'il faut vider dire, 1000, documents intégrés en utilisant le moyen le plus rapide que vous connaissez à partir de maintenant? –