2015-02-22 1 views
0

Есть ли способ сделать этот алгоритм быстрее?rails mongodb найти и удалить дубликат

Я извлекаю все документы для этой модели (Артефакт) и для каждого документа, который я хотел бы знать, если есть дубликат, и если я его удалю.

Artifact.all.to_a.each do |n| 
     image = n.image_original 
     thumb = n.image_thumbnail 
     count_value = Artifact.where(:image_original => image, 
         :image_thumbnail => thumb).all.to_a.count 
     if count_value > 1 
     n.destroy! 
     end 
    end 
+0

Имеет ли смысл упорядочение (т. Е. Если 2 документа имеют одинаковые значения, имеет значение, какой из них вы уничтожаете)? –

+0

@Papouche, не могли бы вы попробовать мое решение? –

ответ

1

Вы должны вызвать uniq метод на коллекции Артефакты, как это:

@all_artifacts = Artifact.all 
@distinct_artifacts = @all_artifacts.uniq {|artifact| artifact.image_original} 

Вы можете использовать Criteria#distinct как этот Artifact.distinct(:image_original), но это будет возвращать только определенные значения только с этим полем.

+0

спасибо @Sharvy, я изменяю, чтобы включить 2 поля '@distinct_artifacts = @ all_artifacts.uniq {| артефакт | artifact.image_original && artifact.image_thumbnail} @ distinct_artifacts.count' => '55905' вместо' 64806' –

+0

Отлично! Добро пожаловать! :) –