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

Bagaimana mengelola dokumen di MongoDB


Pengantar

Saat menggunakan MongoDB, Anda akan menghabiskan sebagian besar waktu Anda untuk mengelola dokumen dengan berbagai cara. Baik Anda membuat dokumen baru dan menambahkannya ke koleksi, mengambil dokumen, memperbarui data, atau memangkas item lama, dokumen adalah inti dari model MongoDB.

Dalam panduan ini, kita akan membahas apa itu dokumen MongoDB dan kemudian membahas operasi umum yang mungkin perlu Anda ketahui untuk mengelola lingkungan yang berpusat pada dokumen.



Apa itu dokumen MongoDB?

Di MongoDB, semua data dalam database dan koleksi disimpan dalam dokumen. Karena koleksi tidak menentukan skema yang diperlukan secara default, dokumen dalam koleksi dapat berisi struktur kompleks yang berubah-ubah dan tidak perlu cocok dengan format yang digunakan oleh dokumen saudara. Ini memberikan fleksibilitas luar biasa dan memungkinkan skema untuk berkembang secara organik saat persyaratan aplikasi berubah.

Dokumen MongoDB sendiri menggunakan format serialisasi data BSON, representasi biner dari JSON JavaScript Object Notation. Ini menyediakan struktur terorganisir dengan tipe data yang ditentukan yang dapat ditanyakan dan dioperasikan secara terprogram.

Dokumen BSON diwakili oleh sepasang kurung kurawal ({} ) yang berisi pasangan nilai kunci. Di BSON, kuplet data ini dikenal sebagai bidang dan nilainya . Bidang didahulukan dan diwakili oleh string. Nilainya bisa berupa tipe data BSON yang valid. Tanda titik dua (: ) memisahkan bidang dari nilainya. Tanda koma digunakan untuk memisahkan setiap bidang dan pasangan nilai satu sama lain.

Sebagai contoh, berikut adalah dokumen BSON valid yang dapat dipahami MongoDB:

{    _id: 80380,    vehicle_type: "car",    mileage: 7377.80,    color: "blue",    markets: [        "US",        "UK"    ],    options: {        transmission: "automatic",        num_doors: 4,        power_windows: true    }}

Di sini, kita dapat melihat beberapa jenis:

  • _id adalah bilangan bulat
  • vehicle_type dan color adalah string
  • mileage adalah pelampung
  • markets adalah larik string
  • options berisi dokumen bersarang dengan nilai yang terdiri dari string, integer, dan boolean

Karena fleksibilitas ini, dokumen merupakan media yang cukup fleksibel untuk menyimpan data. Bidang baru dapat ditambahkan dengan mudah, dokumen dapat disematkan satu sama lain, dan kompleksitas struktural sama persis dengan data yang disimpan.



Cara membuat dokumen baru

Untuk membuat dokumen baru, ubah ke database tempat Anda ingin menyimpan dokumen yang dibuat. Kami akan menggunakan school database untuk tujuan demonstrasi dalam artikel ini:

use school

Anda juga ingin memilih koleksi tempat Anda ingin menyisipkan dokumen. Seperti halnya database, Anda tidak harus secara eksplisit membuat koleksi tempat Anda ingin menyisipkan dokumen. MongoDB akan secara otomatis membuatnya ketika data pertama ditulis. Untuk contoh ini, kami akan menggunakan koleksi yang disebut students .

Sekarang setelah Anda mengetahui di mana dokumen akan disimpan, Anda dapat menyisipkan dokumen baru menggunakan salah satu metode berikut.


Menggunakan insert() metode

insert() metode ini memungkinkan Anda untuk memasukkan satu atau lebih dokumen ke dalam koleksi yang dipanggil.

Untuk menyisipkan satu dokumen, teruskan dokumen ke metode dengan memanggilnya di koleksi. Di sini, kami menyisipkan dokumen baru untuk siswa bernama Ashley:

db.students.insert(    {        first_name: "Ashley",        last_name: "Jenkins",        dob: new Date("January 08, 2003"),        grade_level: 8    })
WriteResult({ "nInserted" : 1 })

Jika Anda ingin menyisipkan lebih dari satu dokumen secara bersamaan, alih-alih meneruskan dokumen ke insert() , melewati array dokumen. Kami dapat menambahkan dua dokumen baru untuk siswa bernama Brian dan Leah:

db.students.insert(    [        {            first_name: "Brian",            last_name: "McMantis",            dob: new Date("September 18, 2010"),            grade_level: 2        },        {            first_name: "Leah",            last_name: "Drake",            dob: new Date("October 03, 2009")        }    ])
BulkWriteResult({        "writeErrors" : [ ],        "writeConcernErrors" : [ ],        "nInserted" : 2,        "nUpserted" : 0,        "nMatched" : 0,        "nModified" : 0,        "nRemoved" : 0,        "upserted" : [ ]})

Karena kami melakukan operasi penulisan massal, nilai kembalian kami adalah BulkWriteResult alih-alih WriteResult objek yang kita lihat sebelumnya.

Sedangkan insert() metode ini fleksibel, sudah tidak digunakan lagi di banyak driver MongoDB demi dua metode berikut.



Menggunakan insertOne() metode

insertOne() metode dapat digunakan untuk menyisipkan satu dokumen. Berbeda dengan insert() metode ini hanya dapat menyisipkan satu dokumen pada satu waktu, yang membuat perilakunya sedikit lebih dapat diprediksi.

Sintaksnya sama seperti saat Anda menggunakan insert() untuk menambahkan satu dokumen. Kita dapat menambahkan siswa lain bernama Naomi:

db.students.insertOne(    {        first_name: "Naomi",        last_name: "Pyani"    })
{        "acknowledged" : true,        "insertedId" : ObjectId("60e877914655cbf49ff7cb86")}

Berbeda dengan insert() , insertOne() metode mengembalikan dokumen yang berisi beberapa informasi berguna tambahan. Ini mengonfirmasi bahwa penulisan telah diakui oleh cluster dan menyertakan ID objek yang ditetapkan ke dokumen karena kami tidak menyediakannya.



Menggunakan insertMany() metode

Untuk menutupi skenario di mana Anda ingin menyisipkan beberapa dokumen sekaligus, insertMany() metode sekarang direkomendasikan. Sama seperti saat menyisipkan banyak dokumen dengan insert() , insertMany() mengambil berbagai dokumen.

Kita dapat menambahkan tiga siswa baru bernama Jasmine, Michael, dan Toni:

db.students.insertMany(    [        {            first_name: "Jasmine",            last_name: "Took",            dob: new Date("April 11, 2011")        },        {            first_name: "Michael",            last_name: "Rodgers",            dob: new Date("February 25, 2008"),            grade_level: 6        },        {            first_name: "Toni",            last_name: "Fowler"        }    ])
{        "acknowledged" : true,        "insertedIds" : [                ObjectId("60e8792d4655cbf49ff7cb87"),                ObjectId("60e8792d4655cbf49ff7cb88"),                ObjectId("60e8792d4655cbf49ff7cb89")        ]}

Seperti insertOne() , insertMany() mengembalikan dokumen yang mengakui penulisan dan menyediakan larik yang berisi ID yang telah ditetapkan ke dokumen yang disisipkan.




Cara membuat kueri untuk dokumen yang ada

Menanyakan dokumen adalah topik yang cukup luas yang menjamin artikelnya sendiri. Anda dapat menemukan detail tentang cara memformulasi kueri untuk mengambil berbagai jenis dokumen dalam panduan kami tentang kueri data dalam MongoDB.

Sementara detailnya paling baik ditinggalkan di artikel yang ditautkan di atas, kami setidaknya dapat membahas metode yang disediakan MongoDB untuk menanyakan dokumen. Cara utama untuk mengambil dokumen dari MongoDB adalah dengan memanggil find() metode pada koleksi yang dimaksud.

Misalnya, untuk mengumpulkan semua dokumen dari students , Anda dapat memanggil find() tanpa argumen:

db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

Untuk membuat output lebih mudah dibaca, Anda juga dapat membuat rantai pretty() metode setelah find() :

db.<collection>.find().pretty()
{        "_id" : ObjectId("60e8743b4655cbf49ff7cb83"),        "first_name" : "Ashley",        "last_name" : "Jenkins",        "dob" : ISODate("2003-01-08T00:00:00Z"),        "grade_level" : 8}{        "_id" : ObjectId("60e875d54655cbf49ff7cb84"),        "first_name" : "Brian",        "last_name" : "McMantis",        "dob" : ISODate("2010-09-18T00:00:00Z"),        "grade_level" : 2}{        "_id" : ObjectId("60e875d54655cbf49ff7cb85"),        "first_name" : "Leah",        "last_name" : "Drake",        "dob" : ISODate("2009-10-03T00:00:00Z")}{        "_id" : ObjectId("60e877914655cbf49ff7cb86"),        "first_name" : "Naomi",        "last_name" : "Pyani"}{        "_id" : ObjectId("60e8792d4655cbf49ff7cb87"),        "first_name" : "Jasmine",        "last_name" : "Took",        "dob" : ISODate("2011-04-11T00:00:00Z")}{        "_id" : ObjectId("60e8792d4655cbf49ff7cb88"),        "first_name" : "Michael",        "last_name" : "Rodgers",        "dob" : ISODate("2008-02-25T00:00:00Z"),       "grade_level" : 6}{        "_id" : ObjectId("60e8792d4655cbf49ff7cb89"),        "first_name" : "Toni",        "last_name" : "Fowler"}

Anda dapat melihat bahwa _id bidang telah ditambahkan ke masing-masing dokumen. MongoDB membutuhkan _id yang unik untuk setiap dokumen dalam koleksi. Jika Anda tidak menyediakannya saat pembuatan objek, itu akan menambahkan satu untuk Anda. Anda dapat menggunakan ID ini untuk mengambil satu objek dengan andal:

db.students.find(    {        _id : ObjectId("60e8792d4655cbf49ff7cb89")    })
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

Anda dapat mengetahui lebih lanjut tentang berbagai cara menanyakan data dengan artikel yang ditautkan di atas.



Cara memperbarui dokumen yang ada

Banyak atau sebagian besar kasus penggunaan untuk database mengharuskan Anda untuk dapat mengubah data yang ada di dalam database. Bidang mungkin perlu diperbarui untuk mencerminkan nilai baru atau Anda mungkin perlu menambahkan informasi tambahan ke dokumen yang sudah ada saat tersedia.

MongoDB menggunakan beberapa metode terkait untuk memperbarui dokumen yang ada:

  • updateOne() :Memperbarui satu dokumen dalam koleksi berdasarkan filter yang disediakan.
  • updateMany() :Memperbarui beberapa dokumen dalam koleksi yang cocok dengan filter yang disediakan.
  • replaceOne() :Mengganti seluruh dokumen dalam koleksi berdasarkan filter yang disediakan.

Kami akan membahas cara menggunakan masing-masing varietas ini untuk melakukan berbagai jenis pembaruan.


Perbarui operator

Sebelum kita melihat masing-masing metode untuk memperbarui dokumen, kita harus membahas beberapa operator pembaruan yang tersedia.

  • $currentDate :Menyetel nilai bidang ke tanggal saat ini, baik sebagai tanggal atau jenis stempel waktu.
    • Sintaks:{ $currentDate: { <field>: <type>, ... } }
  • $inc :Menambah nilai bidang dengan jumlah yang ditetapkan.
    • Sintaks:{ $inc: { <field>: <amount>, ... } }
  • $min :Memperbarui nilai bidang jika nilai yang ditentukan lebih kecil dari nilai saat ini.
    • Sintaks:{ $min: { <field>: <value>, ... } }
  • $max :Memperbarui nilai bidang jika nilai yang ditentukan lebih dari nilai saat ini.
    • Sintaks:{ $max: { <field>: <value>, ... } }
  • $mul :Memperbarui nilai bidang dengan mengalikannya dengan angka yang diberikan.
    • Sintaks:{ $mul: { <field>: <value>, ... } }
  • $rename :Mengganti nama bidang menjadi pengenal baru.
    • Sintaks:{ $rename: { <field>: <new_name>, ... } }
  • $set :Mengganti nilai bidang dengan nilai yang diberikan.
    • Sintaks:{ $set: { <field>: value, ... } }
  • $setOnInsert :Selama operasi upsert, menyetel nilai bidang jika dokumen baru sedang dibuat dan tidak melakukan apa pun sebaliknya.
    • Sintaks:{ $setOnInsert: { <field>: <value>, ... } }
  • $unset :Menghapus bidang dari dokumen.
    • Sintaks:{ $unset: { <field>: "", ... } }
  • $ :Placeholder untuk elemen larik pertama yang memenuhi kueri.
    • Sintaks:{ <update_operator>: {<array>.$: <value> } }
  • $[] :Tempat penampung untuk semua elemen larik yang memenuhi kueri.
    • Sintaks:{ <update_operator>: { <array>.$[]: <value> } }
  • $addToSet :Menambahkan nilai ke array kecuali jika sudah ada.
    • Sintaks:{ $addToSet: { <field>: <value>, ... } }
  • $pop :Menghapus elemen pertama atau terakhir dari sebuah array.
    • Sintaks:{ $pop: { <field>: (-1 or 1), ... } }
  • $pull :Menghapus semua elemen larik yang cocok dengan kondisi.
    • Sintaks:{ $pull: { <field>: <condition>, ... } }
  • $push :Menambahkan nilai ke array.
    • Sintaks:{ $push: { <field>: <value>, ... } }
  • $pullAll :Menghapus semua elemen yang ditentukan dari array.
    • Sintaks:{ $pullAll: { <field>: [ <value>, ... ], ...} }
  • $each :Memodifikasi $addToSet dan $push operator sehingga mereka menambahkan setiap elemen array alih-alih array sebagai elemen tunggal.
    • Sintaks:{ <update_operator>: { <field>: { $each: [ <value>, ... ] }, ... } }
  • $position :Digunakan dengan $each dan tentukan posisi $push operator harus menyisipkan di.
    • Sintaks:{ $push: { <field>: { $each: [ <value>, ... ], $position: <num> } } }
  • $slice :Digunakan dengan $each dan $push untuk membatasi jumlah total elemen dalam array.
    • Sintaks:{ $push: { <field>: { $each: [ <value>, ... ], $slice: <num> } } }
  • $sort :Digunakan dengan $each dan $push untuk mengurutkan elemen array.
    • Sintaks:{ $push: { <field>: { $each: [ <value>, ... ], $sort: <sort_order> } } }

Berbagai operator pembaruan ini memungkinkan Anda memperbarui berbagai bidang dokumen Anda dengan cara yang berbeda.



Memperbarui satu dokumen dalam koleksi

updateOne() MongoDB metode yang digunakan untuk memperbarui satu dokumen dalam koleksi. Metode ini mengambil dua argumen yang diperlukan serta dokumen yang menentukan argumen opsional.

Argumen pertama adalah dokumen yang menentukan kondisi filter yang akan digunakan untuk memilih dokumen. Sejak updateOne() metode memodifikasi paling banyak satu dokumen dalam koleksi, dokumen pertama yang memenuhi kondisi filter akan digunakan.

Argumen kedua menentukan operasi pembaruan yang harus dijalankan. Operasi pembaruan yang diberikan di atas dapat ditentukan di sini untuk mengubah konten dokumen yang cocok.

Argumen ketiga adalah dokumen dari berbagai opsi untuk mengubah perilaku metode. Nilai potensial yang paling penting adalah:

  • upsert :Mengubah operasi menjadi prosedur upsert dengan menyisipkan dokumen baru jika filter tidak cocok dengan dokumen yang ada.
  • collation :Dokumen yang mendefinisikan aturan khusus bahasa yang harus diterapkan untuk operasi.

Sebagai contoh, kita dapat memperbarui satu record siswa yang kita filter dengan _id untuk memastikan bahwa kami menargetkan dokumen yang benar. Kita dapat mengatur grade_level ke nilai baru:

db.students.updateOne(    { _id: ObjectId("60e8792d4655cbf49ff7cb89") },    { $set: { grade_level: 3 } })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }


Memperbarui beberapa dokumen dalam satu koleksi

updateMany() MongoDB cara kerjanya mirip dengan updateOne() metode, melainkan memperbarui dokumen apa pun yang cocok dengan filter yang diberikan alih-alih berhenti setelah kecocokan pertama.

updateMany() sintaks persis mengikuti updateOne() sintaks, jadi satu-satunya perbedaan adalah ruang lingkup operasi.

Sebagai contoh, jika kita ingin mengubah semua instance dari "composition" menjadi "writing" di subjects array di teachers our kami koleksi dokumen, kita bisa menggunakan sesuatu seperti ini:

db.teachers.updateMany(    { subject: "composition" },    { $set: { "subjects.$": "writing" } })
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

Jika Anda memeriksa dokumen, setiap contoh "komposisi" seharusnya diganti dengan "tulisan":

db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Nancy", "last_name" : "Smith", "subjects" : [ "vocabulary", "pronunciation" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }


Mengganti dokumen

replaceOne() cara kerjanya mirip dengan updateOne() metode, tetapi menggantikan seluruh dokumen alih-alih memperbarui bidang individual. Sintaksnya sama dengan dua perintah sebelumnya.

Misalnya, jika Nancy Smith meninggalkan sekolah Anda dan Anda menggantikannya dengan seorang guru bernama Clara Newman yang mengajar sastra, Anda dapat mengetik berikut ini:

db.teachers.replaceOne(    {        $and: [             { first_name: "Nancy" },            { last_name: "Smith" }        ]    },    {        first_name: "Clara",        last_name: "Newman",        subjects: [ "literature" ]    })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

Anda dapat melihat bahwa dokumen yang cocok telah dihapus dan dokumen yang ditentukan telah menggantikannya:

db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Clara", "last_name" : "Newman", "subjects" : [ "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }



Cara menghapus dokumen

Menghapus dokumen dari koleksi juga merupakan bagian dari siklus hidup dokumen. Untuk menghapus dokumen, Anda dapat menggunakan deleteOne() atau deleteMany() metode. Mereka memiliki sintaks yang sama, dan hanya berbeda dalam berapa banyak dokumen yang mereka operasikan.

Untuk sebagian besar, yang harus Anda lakukan untuk menghapus dokumen dengan salah satu metode ini adalah menyediakannya dengan dokumen filter yang menentukan bagaimana Anda ingin memilih dokumen yang akan dihapus. deleteOne() metode akan menghapus paling banyak satu dokumen (terlepas dari berapa banyak kecocokan yang dihasilkan filter) sementara deleteMany() metode menghapus setiap dokumen yang cocok dengan kondisi filter.

Misalnya, untuk menghapus satu siswa, Anda dapat memberikan _id untuk mencocokkannya secara eksplisit:

db.students.deleteOne({    _id: ObjectId("60e8792d4655cbf49ff7cb87")})
{ "acknowledged" : true, "deletedCount" : 1 }

Jika kita ingin menghapus siswa yang tidak memiliki tingkat kelas yang ditetapkan, kita dapat menggunakan deleteMany() sebagai gantinya:

db.students.deleteMany({    grade_level: { $eq: null }})
{ "acknowledged" : true, "deletedCount" : 2 }

Jika kita periksa, kita akan melihat bahwa semua siswa yang tersisa memiliki tingkat kelas yang ditetapkan:

db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler", "grade_level" : 3 }


Kesimpulan

Mempelajari cara membuat, membuat kueri, memperbarui, dan menghapus dokumen memberi Anda keterampilan yang Anda butuhkan untuk mengelola dokumen secara efektif dalam MongoDB setiap hari. Menjadi akrab dengan berbagai dokumen dan metode pengumpulan dan operator yang memungkinkan Anda untuk mencocokkan dan mengubah informasi memungkinkan Anda mengekspresikan pemikiran kompleks yang dapat dipahami oleh sistem database.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongooseError - Operasi buffering `users.findOne()` habis setelah 10000ms

  2. Arsitek untuk Keamanan :Panduan untuk MongoDB

  3. Sertakan Bidang Tertentu dalam Indeks Wildcard di MongoDB

  4. Dorong Mongo ke array di dalam array

  5. Bagaimana cara menggunakan data yang dibuang oleh mongodump?