MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Runtime mengubah model dengan mongodb/mongoid

Secara umum, mungkin untuk memperbarui dokumen lama dengan bidang baru saat runtime. Tidak perlu migrasi di MongoDB.

Anda mungkin ingin menulis tugas menyapu untuk memperbarui dokumen lama Anda dengan bidang baru dan nilai default.

Anda dapat mengetahui dokumen-dokumen ini dengan memeriksa bidang-bidang baru yang memiliki nilai nol per default.

Perbarui

Gaya yang mudah:

Jika Anda menentukan bidang baru dengan nilai default, nilai ini harus selalu digunakan selama Anda menetapkan yang baru:

app/models/my_model.rb

class MyModel
  include Mongoid::Document
  field :name, type: String
  field :data, type: String
  # NEW FIELD
  field :note, type: String, default: "no note given so far!"
end

Jika Anda menanyakan database Anda, Anda harus mendapatkan nilai default untuk dokumen yang tidak memiliki bidang ini sebelum ekstensi Anda:

(rel konsol)

MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">

Saya menguji ini dengan tumpukan Rails baru dengan mongoid saat ini di Ruby 1.9.2 - harus bekerja dengan tumpukan lain juga.

Gaya yang lebih rumit/kompleks:

Jika Anda tidak menetapkan nilai default, Anda akan mendapatkan nil untuk bidang baru ini.

app/models/my_model.rb

class MyModel
  include Mongoid::Document
  field :name, type: String
  field :data, type: String
  # NEW FIELD
  field :note, type: String
end

(rel konsol)

MyModel.first
#=> #<MyModel …other fields…, note: nil>

Kemudian Anda dapat mengatur tugas menyapu dan file migrasi seperti dalam contoh ini:

lib/tasks/my_model_migration.rake:

namespace :mymodel do
  desc "MyModel migration task"
  task :migrate => :environment do
    require "./db/migrate.rb"
  end
end

db/migrate.rb:

olds = MyModel.where(note: nil)
# Enumerator of documents without a valid :note field (= nil)
olds.each do |doc|
  doc.note = "(migration) no note given yet"
  # or whatever your desired default value should be
  doc.save! rescue puts "Could not modify doc #{doc.id}/#{doc.name}"
  # the rescue is only a failsafe statement if something goes wrong
end

Jalankan migrasi ini dengan rake mymodel:migrate .

Ini hanya titik awal dan Anda dapat memperluasnya ke mesin migrasi mongoid penuh.

task :migrate => :environment do … diperlukan, jika tidak, rake tidak akan memuat model.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menyimpan file di mongodb menggunakan node.js

  2. Hitung elemen array yang cocok dengan kondisi

  3. Hitung bidang Sub dokumen yang Berbeda dan Output sebagai Tombol Bernama

  4. Cara mengelompokkan data menggunakan template mongo

  5. Bisakah Anda menentukan kunci untuk $addToSet di Mongo?