2011-12-08 35 views
0

私は文書患者と、患者の埋め込み文書手続きを持っています。どういうわけか私は特定の患者のための複写されたプロシージャ組み込み文書の作成につながった私のプロシージャテーブルの重複したエントリをインポートしました。 これらの重複したエントリを削除する必要がありますが、これを行うことはできません。 重複する埋め込みドキュメントレコードに対してdeleteメソッドを使用すると、「削除はプライベートメソッドです」というエラーがスローされます。 私は私が埋め込まれた文書の重複したエントリを削除することができますどのようにこのMongoDBで埋め込み文書レコードを削除するには?

if type == "procedures" 

    count = 0 
    user.access_self 
    unique_procedures = Set.new 
    user.procedures.each{|each_proc| 
    each_proc.access_self 
    if !unique_procedures.include?("#{each_proc.access_self.name} #{each_proc.hid_code}") 
     unique_procedures.add("#{each_proc.access_self.name} #{each_proc.hid_code}") 
    else 
     each_proc.delete 
     count = count + 1 
    end 
    } 
    if count > 0 
    puts "#{user.full_name} has #{count} duplicate procedures." 
    puts "#{count} duplicate procedures deleted." 
    else 
    puts "#{user.full_name} has no procedures." 
    end 
    return count 
end 

のようなものを行っています?ここで[OK]を

+0

あなたの文書スキーマまたはいくつかのサンプル文書を示していただけますか?手続きは配列でなければならず、埋め込みドキュメントではないと思われます($ add_to_set修飾子を使用する必要がありますが、正しく記述してください) –

+0

重複した埋め込みドキュメントレコードを削除したいだけです。埋め込みドキュメントの2つのキーの組み合わせdelete_ifはこの点で私を助けません –

+0

ちょっと、以下のコードがまったく役に立たなかったかどうかは分かりませんでした。 –

答えて

2

は一例です:

require 'rubygems' 
require 'mongo' 

# make the connection 
@conn = Mongo::Connection.new 
@db = @conn['test'] 
@patients = @db['patients'] 

# clear out the old collection 
@patients.drop 

# create some fake procedures 
tummy_ache = { :technical_name => 'apendectomy' } 
nose_job = { :technical_name => 'rhinoplasty' } 

# create some fake patients with duplicate procedures 
patient1 = { 
    :full_name => 'Tyler Brock', 
    :procedures => [ tummy_ache, nose_job, nose_job ] 
} 

patient2 = { 
    :full_name => 'Fake Name', 
    :procedures => [ tummy_ache, tummy_ache, nose_job ] 
} 

patients = [patient1, patient2] 

# put the patients into the collection 
@patients.insert patients 

# remove duplicates 
@patients.find.each do |patient| 
    patient['procedures'] = patient['procedures'].inject([]) do |list, procedure| 
     list << procedure unless list.include?(procedure) 
     list 
    end 
    @patients.update({"_id" => patient["_id"]}, patient) 
end 

# print collection -- now sans duplicates 
@patients.find.each do |patient| 
    puts patient.inspect 
end 
関連する問題