Как удалить встроенные записи документа в MongoDB? - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть пациент с документами и встроенная процедура для пациентов.Каким-то образом я импортировал дубликаты записей в мою таблицу процедур, что привело к созданию дубликата встроенного документа процедуры для конкретного пациента.Теперь мне нужно удалить эти дубликаты, но я не могу этого сделать.Когда я использую метод удаления для дублированной записи встроенного документа, выдается сообщение об ошибке «удаление - это частный метод».Я сделал что-то вроде этого

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

Как я могу удалить дубликаты записей встроенного документа ??

1 Ответ

2 голосов
/ 17 декабря 2011

Хорошо, вот пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...