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

Mengapa Mongoose memiliki skema dan model?

EDIT: Meskipun ini bermanfaat bagi banyak orang, seperti yang disebutkan dalam komentar, ini menjawab "bagaimana" daripada mengapa. Untungnya, mengapa dari pertanyaan tersebut telah dijawab di tempat lain juga, dengan jawaban ini untuk pertanyaan lain. Ini telah ditautkan di komentar untuk beberapa waktu tetapi saya menyadari bahwa banyak yang mungkin tidak sampai sejauh itu ketika membaca.

Seringkali cara termudah untuk menjawab jenis pertanyaan ini adalah dengan sebuah contoh. Dalam hal ini, seseorang telah melakukannya untuk saya :)

Lihat di sini:

http://rawberg.com/blog/nodejs/mongoose-orm-nested-models/

EDIT: Pos asli (seperti yang disebutkan dalam komentar) tampaknya tidak ada lagi, jadi saya mereproduksinya di bawah. Jika ia kembali, atau baru saja pindah, beri tahu saya.

Ini memberikan deskripsi yang layak tentang penggunaan skema dalam model di luwak dan mengapa Anda ingin melakukannya, dan juga menunjukkan cara mendorong tugas melalui model sementara skema adalah semua tentang struktur dll.

Pos Asli:

Mari kita mulai dengan contoh sederhana penyematan skema di dalam model.

var TaskSchema = new Schema({
    name: String,
    priority: Number
});
 
TaskSchema.virtual('nameandpriority')
    .get( function () {
        return this.name + '(' + this.priority + ')';
    });
 
TaskSchema.method('isHighPriority', function() {
    if(this.priority === 1) {
        return true;
    } else {
        return false;
    }
}); 
 
var ListSchema = new Schema({
    name: String,
    tasks: [TaskSchema]
});
 
mongoose.model('List', ListSchema);
 
var List = mongoose.model('List');
 
var sampleList = new List({name:'Sample List'});

Saya membuat TaskSchema baru objek dengan info dasar yang mungkin dimiliki tugas. Atribut virtual Mongoose diatur untuk menggabungkan nama dan prioritas Tugas dengan mudah. Saya hanya menentukan pengambil di sini tetapi setter virtual juga didukung.

Saya juga mendefinisikan metode tugas sederhana yang disebut isHighPriority untuk mendemonstrasikan cara kerja metode dengan penyiapan ini.

Dalam ListSchema definisi Anda akan melihat bagaimana tasks kunci dikonfigurasi untuk menampung larik TaskSchema objek. tasks key akan menjadi turunan dari DocumentArray yang menyediakan metode khusus untuk menangani dokumen Mongo yang disematkan.

Untuk saat ini saya hanya melewati ListSchema objek ke mongoose.model dan tinggalkan TaskSchema keluar. Secara teknis tidak perlu mengubah TaskSchema menjadi model formal karena kami tidak akan menyimpannya di koleksi sendiri. Nanti saya akan menunjukkan kepada Anda bagaimana itu tidak membahayakan apa pun jika Anda melakukannya dan itu dapat membantu mengatur semua model Anda dengan cara yang sama terutama ketika mereka mulai merentangkan banyak file.

Dengan List penyiapan model mari tambahkan beberapa tugas ke dalamnya dan simpan ke Mongo.

var List = mongoose.model('List');
var sampleList = new List({name:'Sample List'});
 
sampleList.tasks.push(
    {name:'task one', priority:1}, 
    {name:'task two', priority:5}
);
 
sampleList.save(function(err) {
    if (err) {
        console.log('error adding new list');
        console.log(err);
    } else {
        console.log('new list successfully saved'); 
    }
});

Atribut tugas pada instance List our kami model (sampleList ) berfungsi seperti larik JavaScript biasa dan kita dapat menambahkan tugas baru ke dalamnya menggunakan Push. Yang penting diperhatikan adalah tasks ditambahkan sebagai objek JavaScript biasa. Ini adalah perbedaan halus yang mungkin tidak langsung intuitif.

Anda dapat memverifikasi dari shell Mongo bahwa daftar dan tugas baru telah disimpan ke mongo.

db.lists.find()
{ "tasks" : [
    {
        "_id" : ObjectId("4dd1cbeed77909f507000002"),
        "priority" : 1,
        "name" : "task one"
    },
    {
        "_id" : ObjectId("4dd1cbeed77909f507000003"),
        "priority" : 5,
        "name" : "task two"
    }
], "_id" : ObjectId("4dd1cbeed77909f507000001"), "name" : "Sample List" }

Sekarang kita dapat menggunakan ObjectId untuk membuka Sample List dan mengulangi tugas-tugasnya.

List.findById('4dd1cbeed77909f507000001', function(err, list) {
    console.log(list.name + ' retrieved');
    list.tasks.forEach(function(task, index, array) {
        console.log(task.name);
        console.log(task.nameandpriority);
        console.log(task.isHighPriority());
    });
});

Jika Anda menjalankan bit terakhir kode tersebut, Anda akan mendapatkan pesan kesalahan yang mengatakan bahwa dokumen yang disematkan tidak memiliki metode isHighPriority . Dalam versi Mongoose saat ini, Anda tidak dapat mengakses metode pada skema yang disematkan secara langsung. Ada tiket terbuka untuk memperbaikinya dan setelah mengajukan pertanyaan ke Grup Google Mongoose, manimal45 memposting solusi yang berguna untuk digunakan saat ini.

List.findById('4dd1cbeed77909f507000001', function(err, list) {
    console.log(list.name + ' retrieved');
    list.tasks.forEach(function(task, index, array) {
        console.log(task.name);
        console.log(task.nameandpriority);
        console.log(task._schema.methods.isHighPriority.apply(task));
    });
});

Jika Anda menjalankan kode itu, Anda akan melihat output berikut pada baris perintah.

Sample List retrieved
task one
task one (1)
true
task two
task two (5)
false

Dengan solusi tersebut, mari kita ubah TaskSchema menjadi model luwak.

mongoose.model('Task', TaskSchema);
 
var Task = mongoose.model('Task');
 
var ListSchema = new Schema({
    name: String,
    tasks: [Task.schema]
});
 
mongoose.model('List', ListSchema);
 
var List = mongoose.model('List');

TaskSchema definisinya sama seperti sebelumnya jadi saya tinggalkan. Setelah berubah menjadi model, kita masih dapat mengakses objek Skema yang mendasarinya menggunakan notasi titik.

Mari buat daftar baru dan sematkan dua contoh model Tugas di dalamnya.

var demoList = new List({name:'Demo List'});
 
var taskThree = new Task({name:'task three', priority:10});
var taskFour = new Task({name:'task four', priority:11});
 
demoList.tasks.push(taskThree.toObject(), taskFour.toObject());
 
demoList.save(function(err) {
    if (err) {
        console.log('error adding new list');
        console.log(err);
    } else {
        console.log('new list successfully saved'); 
    }
});

Saat kami menyematkan instance model Tugas ke dalam Daftar, kami memanggil toObject pada mereka untuk mengubah data mereka menjadi objek JavaScript biasa yang List.tasks DocumentArray mengharapkan. Saat Anda menyimpan instance model dengan cara ini, dokumen tersemat Anda akan berisi ObjectIds .

Contoh kode lengkap tersedia sebagai Intisari. Mudah-mudahan solusi ini membantu memuluskan segalanya saat Mongoose terus berkembang. Saya masih cukup baru di Mongoose dan MongoDB jadi jangan ragu untuk membagikan solusi dan tip yang lebih baik di komentar. Selamat membuat model data!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sesi Musim Semi dengan MongoDB

  2. MongoDB $indexOfCP

  3. Permintaan nomor panjang Java Mongodb

  4. MongoDB:periksa koneksi ke DB

  5. Apa yang terjadi dengan Meteor dan Fibers/bindEnvironment()?