MongoDB Veritabanı Nasıl Oluşturulur: Bilinmesi Gereken 6 Kritik Yön
Yayınlanan: 2022-11-07Yazılımınız için gereksinimlerinize bağlı olarak esneklik, ölçeklenebilirlik, performans veya hıza öncelik verebilirsiniz. Bu nedenle, geliştiriciler ve işletmeler, ihtiyaçları için bir veritabanı seçerken genellikle kafaları karışır. Yüksek esneklik ve ölçeklenebilirlik sağlayan bir veritabanına ve müşteri analitiği için veri toplamaya ihtiyacınız varsa, MongoDB sizin için doğru seçim olabilir!
Bu yazıda, MongoDB veritabanının yapısını ve veritabanınızı nasıl oluşturacağınızı, izleyeceğinizi ve yöneteceğinizi tartışacağız! Başlayalım.
MongoDB Veritabanı Nasıl Yapılandırılır?
MongoDB, şemasız bir NoSQL veritabanıdır. Bu, SQL veritabanları için yaptığınız gibi tablolar/veritabanları için bir yapı belirtmediğiniz anlamına gelir.
NoSQL veritabanlarının aslında ilişkisel veritabanlarından daha hızlı olduğunu biliyor muydunuz? Bunun nedeni dizin oluşturma, parçalama ve toplama işlem hatları gibi özelliklerdir. MongoDB ayrıca hızlı sorgu yürütmesiyle bilinir. Bu nedenle Google, Toyota, Forbes gibi şirketler tarafından tercih edilmektedir.
Aşağıda, MongoDB'nin bazı temel özelliklerini keşfedeceğiz.
Belgeler
MongoDB, verileri JSON belgeleri olarak depolayan bir belge veri modeline sahiptir. Belgeler, uygulama kodundaki nesnelerle doğal olarak eşleşir, bu da geliştiricilerin kullanımını daha kolay hale getirir.
İlişkisel bir veritabanı tablosunda, yeni bir alan eklemek için bir sütun eklemelisiniz. JSON belgesindeki alanlarda durum böyle değil. JSON belgesindeki alanlar belgeden belgeye farklılık gösterebilir, bu nedenle veritabanındaki her kayda eklenmezler.
Belgeler, hiyerarşik ilişkileri ifade etmek için yuvalanabilen diziler gibi yapıları depolayabilir. Ayrıca MongoDB, belgeleri ikili JSON (BSON) türüne dönüştürür. Bu, dize, tamsayı, boolean sayı ve çok daha fazlası gibi çeşitli veri türleri için daha hızlı erişim ve daha fazla destek sağlar!
Çoğaltma Setleri
MongoDB'de yeni bir veritabanı oluşturduğunuzda, sistem otomatik olarak verilerinizin en az 2 kopyasını daha oluşturur. Bu kopyalar "replika kümeleri" olarak bilinir ve bunlar arasında verileri sürekli olarak çoğaltarak verilerinizin daha iyi kullanılabilir olmasını sağlar. Ayrıca bir sistem arızası veya planlı bakım sırasında kesinti süresine karşı koruma sağlarlar.
Koleksiyonlar
Koleksiyon, bir veritabanıyla ilişkili bir grup belgedir. İlişkisel veritabanlarındaki tablolara benzerler.
Ancak koleksiyonlar çok daha esnektir. Birincisi, bir şemaya güvenmiyorlar. İkincisi, belgelerin aynı veri türünden olması gerekmez!
Bir veritabanına ait koleksiyonların listesini görüntülemek için listCollections
komutunu kullanın.
Toplama İşlem Hatları
Bu çerçeveyi birkaç işleç ve ifadeyi birleştirmek için kullanabilirsiniz. Esnektir çünkü herhangi bir yapının verilerini işlemenize, dönüştürmenize ve analiz etmenize olanak tanır.
Bu nedenle MongoDB, 150 operatör ve ifadede hızlı veri akışlarına ve özelliklere izin verir. Aynı zamanda, birden fazla koleksiyondan elde edilen sonuçları esnek bir şekilde bir araya getiren Birlik aşaması gibi birkaç aşamaya sahiptir.
dizinler
Verimliliğini artırmak ve sorgu hızını artırmak için bir MongoDB belgesindeki herhangi bir alanı indeksleyebilirsiniz. Dizin oluşturma, incelenen belgeleri sınırlamak için dizini tarayarak zaman kazandırır. Bu, koleksiyondaki her belgeyi okumaktan çok daha iyi değil mi?
Birden çok alandaki bileşik dizinler dahil olmak üzere çeşitli dizin oluşturma stratejilerini kullanabilirsiniz. Örneğin, ayrı alanlarda çalışanın adını ve soyadını içeren birkaç belgeniz olduğunu varsayalım. Adın ve soyadının döndürülmesini istiyorsanız, hem “Soyadı” hem de “Ad”ı içeren bir dizin oluşturabilirsiniz. Bu, “Soyadı” üzerinde bir dizine ve “Ad” üzerinde bir dizine sahip olmaktan çok daha iyi olurdu.
Hangi sorgunun dizinlerden yararlanabileceğini daha iyi anlamak için Performans Danışmanı gibi araçlardan yararlanabilirsiniz.
parçalama
Sharding, tek bir veri kümesini birden çok veritabanına dağıtır. Bu veri seti daha sonra bir sistemin toplam depolama kapasitesini artırmak için birden fazla makinede saklanabilir. Bunun nedeni, daha büyük veri kümelerini daha küçük parçalara ayırması ve bunları çeşitli veri düğümlerinde depolamasıdır.
MongoDB, verileri koleksiyon düzeyinde parçalar, bir koleksiyondaki belgeleri bir kümedeki parçalar arasında dağıtır. Bu, mimarinin en büyük uygulamaları işlemesine izin vererek ölçeklenebilirliği sağlar.
MongoDB Veritabanı Nasıl Oluşturulur
Önce işletim sisteminize uygun doğru MongoDB paketini kurmanız gerekecek. 'MongoDB Community Server'ı İndirin' sayfasına gidin. Mevcut seçeneklerden, zip dosyası olarak en son "sürüm", "paket" biçimini ve işletim sisteminiz olarak "platform"u seçin ve aşağıda gösterildiği gibi "İndir"e tıklayın:

İşlem oldukça basittir, bu nedenle sisteminizde kısa sürede MongoDB kurulu olacaktır!
Kurulumu tamamladıktan sonra, komut isteminizi açın ve doğrulamak için mongod -version
yazın. Aşağıdaki çıktıyı almazsanız ve bunun yerine bir dizi hata görürseniz, onu yeniden yüklemeniz gerekebilir:

MongoDB Shell'i Kullanma
Başlamadan önce şunlardan emin olun:
- Müşteriniz, Aktarım Katmanı Güvenliğine sahip ve IP izin verilenler listenizde.
- İstediğiniz MongoDB kümesinde bir kullanıcı hesabınız ve parolanız var.
- Cihazınıza MongoDB kurdunuz.
Adım 1: MongoDB Kabuğuna Erişin
MongoDB kabuğuna erişmek için aşağıdaki komutu yazın:
net start MongoDB
Bu, aşağıdaki çıktıyı vermelidir:

Önceki komut MongoDB sunucusunu başlattı. Çalıştırmak için komut istemine mongo
gerekir.

Burada MongoDB kabuğunda, veritabanları oluşturmak, veri eklemek, verileri düzenlemek, idari komutlar vermek ve verileri silmek için komutlar yürütebiliriz.
Adım 2: Veritabanınızı Oluşturun
SQL'den farklı olarak, MongoDB'nin bir veritabanı oluşturma komutu yoktur. Bunun yerine, belirli bir veritabanına geçiş yapan use
adlı bir anahtar sözcük vardır. Veritabanı yoksa, yeni bir veritabanı oluşturur, yoksa mevcut veritabanına bağlanır.
Örneğin, "şirket" adlı bir veritabanı başlatmak için şunu yazın:
use Company

Sisteminizde yeni oluşturduğunuz veritabanını onaylamak için db
yazabilirsiniz. Oluşturduğunuz yeni veritabanı açılırsa, ona başarıyla bağlandınız.
Mevcut veritabanlarını kontrol etmek istiyorsanız, show dbs
yazın ve sisteminizdeki tüm veritabanlarını döndürecektir:

Varsayılan olarak, MongoDB'yi yüklemek yönetici, yapılandırma ve yerel veritabanlarını oluşturur.
Oluşturduğumuz veritabanının görüntülenmediğini fark ettiniz mi? Bunun nedeni, henüz değerleri veritabanına kaydetmemiş olmamızdır! Veritabanı yönetimi bölümü altında yerleştirmeyi tartışacağız.
Atlas kullanıcı arayüzünü kullanma
MongoDB'nin veritabanı hizmeti Atlas'ı da kullanmaya başlayabilirsiniz. Atlas'ın bazı özelliklerine erişmek için ödeme yapmanız gerekebilir, ancak çoğu veritabanı işlevi ücretsiz katmanda mevcuttur. Ücretsiz katmanın özellikleri, bir MongoDB veritabanı oluşturmak için fazlasıyla yeterli.
Başlamadan önce şunlardan emin olun:
- IP'niz izin verilenler listesinde.
- Kullanmak istediğiniz MongoDB kümesinde bir kullanıcı hesabınız ve parolanız var.
AtlasUI ile bir MongoDB Veritabanı oluşturmak için bir tarayıcı penceresi açın ve https://cloud.mongodb.com adresinde oturum açın. Küme sayfanızdan Koleksiyonlara Gözat 'ı tıklayın. Kümede veri tabanı yoksa, Kendi Verimi Ekle Butonuna tıklayarak veri tabanınızı oluşturabilirsiniz.
Bilgi istemi sizden bir veritabanı ve koleksiyon adı sağlamanızı isteyecektir. Bunları adlandırdıktan sonra Oluştur 'u tıklayın ve işiniz bitti! Artık yeni belgeler girebilir veya sürücüleri kullanarak veritabanına bağlanabilirsiniz.
MongoDB Veritabanınızı Yönetme
Bu bölümde, MongoDB veritabanınızı etkili bir şekilde yönetmenin birkaç şık yolunu inceleyeceğiz. Bunu MongoDB Pusulası'nı kullanarak veya koleksiyonlar aracılığıyla yapabilirsiniz.
Koleksiyonları Kullanma
İlişkisel veritabanları, belirli veri türleri ve sütunları ile iyi tanımlanmış tablolara sahipken, NoSQL'in tablolar yerine koleksiyonları vardır. Bu koleksiyonların herhangi bir yapısı yoktur ve belgeler değişiklik gösterebilir; aynı koleksiyondaki başka bir belgenin biçimini eşleştirmek zorunda kalmadan farklı veri türlerine ve alanlara sahip olabilirsiniz.
Göstermek için “Çalışan” adında bir koleksiyon oluşturalım ve buna bir belge ekleyelim:
db.Employee.insert( { "Employeename" : "Chris", "EmployeeDepartment" : "Sales" } )
Ekleme başarılı olursa WriteResult({ "nInserted" : 1 })
döndürür:

Burada “db” o anda bağlı olan veritabanını ifade eder. “Çalışan”, şirket veri tabanında yeni oluşturulan koleksiyondur.
Burada bir birincil anahtar belirlemedik çünkü MongoDB otomatik olarak “_id” adında bir birincil anahtar alanı oluşturur ve ona varsayılan bir değer ayarlar.
Koleksiyonu JSON formatında kontrol etmek için aşağıdaki komutu çalıştırın:
db.Employee.find().forEach(printjson)
Çıktı:
{ "_id" : ObjectId("63151427a4dd187757d135b8"), "Employeename" : "Chris", "EmployeeDepartment" : "Sales" }
“_id” değeri otomatik olarak atanırken, varsayılan birincil anahtarın değerini değiştirebilirsiniz. Bu sefer “Çalışan” veritabanına “_id” değeri “1” olan başka bir belge ekleyeceğiz:
db.Employee.insert( { "_id" : 1, "EmployeeName" : "Ava", "EmployeeDepartment" : "Public Relations" } )
db.Employee.find().forEach(printjson)
komutunu çalıştırdığımızda aşağıdaki çıktıyı alırız:

Yukarıdaki çıktıda, “Ava” için “_id” değeri otomatik olarak bir değer atanmak yerine “1” olarak ayarlanır.
Veritabanına başarıyla değerler eklediğimize göre, aşağıdaki komutu kullanarak sistemimizde mevcut veritabanlarının altında görünüp görünmediğini kontrol edebiliriz:
show dbs

Ve işte! Sisteminizde başarıyla bir veritabanı oluşturdunuz!
MongoDB Pusulası'nı Kullanma
Mongo kabuğundan MongoDB sunucuları ile çalışabilsek de bazen sıkıcı olabiliyor. Bunu bir üretim ortamında yaşayabilirsiniz.
Ancak, MongoDB tarafından oluşturulan ve bunu kolaylaştırabilecek bir pusula aracı (uygun olarak adlandırılan Pusula) vardır. Daha iyi bir GUI'ye ve veri görselleştirme, performans profili oluşturma ve verilere, veritabanlarına ve koleksiyonlara CRUD (oluşturma, okuma, güncelleme, silme) erişimi gibi ek işlevlere sahiptir.
İşletim sisteminiz için Compass IDE'yi indirebilir ve basit işlemiyle kurabilirsiniz.
Ardından uygulamayı açın ve bağlantı dizesini yapıştırarak sunucuyla bağlantı oluşturun. Bulamazsanız, Bağlantı alanlarını tek tek doldur seçeneğine tıklayabilirsiniz. MongoDB'yi kurarken bağlantı noktası numarasını değiştirmediyseniz, bağlan düğmesine tıklamanız yeterlidir, işte buradasınız! Aksi takdirde, ayarladığınız değerleri girin ve Bağlan'a tıklayın.

Ardından, Yeni Bağlantı penceresinde Ana Bilgisayar Adı, Bağlantı Noktası ve Kimlik Doğrulamayı sağlayın.
MongoDB Compass'ta bir veritabanı oluşturabilir ve ilk koleksiyonunu aynı anda ekleyebilirsiniz. İşte bunu nasıl yapacağınız:
- İstemi açmak için Veritabanı Oluştur'a tıklayın.
- Veritabanının adını ve ilk koleksiyonunu girin.
- Veritabanı Oluştur'u tıklayın.
Veritabanınızın adına tıklayarak ve ardından Belgeler sekmesini görmek için koleksiyonun adına tıklayarak veritabanınıza daha fazla belge ekleyebilirsiniz. Ardından, koleksiyonunuza bir veya daha fazla belge eklemek için Veri Ekle düğmesini tıklayabilirsiniz.
Belgelerinizi eklerken birer birer veya bir dizide birden çok belge olarak girebilirsiniz. Birden çok belge ekliyorsanız, bu virgülle ayrılmış belgelerin köşeli parantez içine alındığından emin olun. Örneğin:
{ _id: 1, item: { name: "apple", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }, { _id: 2, item: { name: "banana", code: "123" }, qty: 20, tags: [ "B" ] }, { _id: 3, item: { name: "spinach", code: "456" }, qty: 25, tags: [ "A", "B" ] }, { _id: 4, item: { name: "lentils", code: "456" }, qty: 30, tags: [ "B", "A" ] }, { _id: 5, item: { name: "pears", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }, { _id: 6, item: { name: "strawberry", code: "123" }, tags: [ "B" ] }
Son olarak, belgeleri koleksiyonunuza eklemek için Ekle'ye tıklayın. Bir belgenin gövdesi şöyle görünür:
{ "StudentID" : 1 "StudentName" : "JohnDoe" }
Burada alan adları “ÖğrenciKimliği” ve “ÖğrenciAdı”dır. Alan değerleri sırasıyla “1” ve “JohnDoe”dur.
Faydalı Komutlar
Bu koleksiyonları rol yönetimi ve kullanıcı yönetimi komutları ile yönetebilirsiniz.
Kullanıcı Yönetimi Komutları
MongoDB kullanıcı yönetimi komutları, kullanıcıya ait komutları içerir. Bu komutları kullanarak kullanıcıları oluşturabilir, güncelleyebilir ve silebiliriz.
dropKullanıcı
Bu komut, belirtilen veritabanından tek bir kullanıcıyı kaldırır. Sözdizimi aşağıdadır:
db.dropUser(username, writeConcern)
Burada kullanıcı adı, username
ile ilgili kimlik doğrulama ve erişim bilgilerini içeren belgeyi içeren zorunlu bir alandır. İsteğe bağlı writeConcern
alanı, oluşturma işlemi için yazma kaygısının düzeyini içerir. Yazma endişesinin düzeyi, isteğe bağlı writeConcern
alanıyla belirlenebilir.
userAdminAnyDatabase
rolüne sahip bir kullanıcıyı bırakmadan önce, kullanıcı yönetimi ayrıcalıklarına sahip en az bir başka kullanıcı olduğundan emin olun.
Bu örnekte, "user26" kullanıcısını test veritabanına bırakacağız:
use test db.dropUser("user26", {w: "majority", wtimeout: 4000})
Çıktı:
> db.dropUser("user26", {w: "majority", wtimeout: 4000}); true
Kullanıcı oluştur
Bu komut, belirtilen veritabanı için aşağıdaki gibi yeni bir kullanıcı oluşturur:
db.createUser(user, writeConcern)
Burada user
, oluşturulacak kullanıcı hakkında kimlik doğrulama ve erişim bilgilerinin bulunduğu belgeyi içeren zorunlu bir alandır. İsteğe bağlı writeConcern
alanı, oluşturma işlemi için yazma kaygısının düzeyini içerir. Yazma kaygısının düzeyi, isteğe bağlı alan olan writeConcern
tarafından belirlenebilir.
createUser
, kullanıcı veritabanında zaten varsa, yinelenen bir kullanıcı hatası döndürür.
Test veritabanında aşağıdaki gibi yeni bir kullanıcı oluşturabilirsiniz:
use test db.createUser( { user: "user26", pwd: "myuser123", roles: [ "readWrite" ] } );
Çıktı aşağıdaki gibidir:
Successfully added user: { "user" : "user26", "roles" : [ "readWrite", "dbAdmin" ] }
GrantRolesToUser
Bir kullanıcıya ek roller vermek için bu komuttan yararlanabilirsiniz. Bunu kullanmak için aşağıdaki sözdizimini aklınızda tutmanız gerekir:
db.runCommand( { grantRolesToUser: "<user>", roles: [ <roles> ], writeConcern: { <write concern> }, comment: <any> } )
Yukarıda bahsedilen rollerde hem kullanıcı tanımlı hem de yerleşik roller belirtebilirsiniz. grantRolesToUser
çalıştığı veritabanında bulunan bir rolü belirtmek isterseniz, rolü aşağıda belirtildiği gibi bir belgeyle belirtebilirsiniz:
{ role: "<role>", db: "<database>" }
Veya rolü, rolün adıyla belirtebilirsiniz. Örneğin:
"readWrite"
Farklı bir veritabanında bulunan rolü belirtmek istiyorsanız, rolü farklı bir belgeyle belirtmeniz gerekir.
Bir veritabanında rol vermek için, belirtilen veritabanında grantRole
eylemine ihtiyacınız vardır.
İşte size net bir resim vermek için bir örnek. Örneğin, ürün veritabanında aşağıdaki rollere sahip bir productUser00 kullanıcısını alın:
"roles" : [ { "role" : "assetsWriter", "db" : "assets" } ]
grantRolesToUser
işlemi, "productUser00" için stok veritabanında readWrite
rolünü ve ürün veritabanında read rolünü sağlar:
use products db.runCommand({ grantRolesToUser: "productUser00", roles: [ { role: "readWrite", db: "stock"}, "read" ], writeConcern: { w: "majority" , wtimeout: 2000 } })
Ürünler veritabanındaki productUser00 kullanıcısı artık aşağıdaki rollere sahiptir:
"roles" : [ { "role" : "assetsWriter", "db" : "assets" }, { "role" : "readWrite", "db" : "stock" }, { "role" : "read", "db" : "products" } ]
kullanıcılarBilgi
Bir veya daha fazla kullanıcı hakkında bilgi döndürmek için usersInfo
komutunu kullanabilirsiniz. İşte sözdizimi:
db.runCommand( { usersInfo: <various>, showCredentials: <Boolean>, showCustomData: <Boolean>, showPrivileges: <Boolean>, showAuthenticationRestrictions: <Boolean>, filter: <document>, comment: <any> } ) { usersInfo: <various> }
Erişim açısından, kullanıcılar her zaman kendi bilgilerine bakabilirler. Başka bir kullanıcının bilgilerine bakmak için, komutu çalıştıran kullanıcının, diğer kullanıcının veritabanındaki viewUser
eylemini içeren ayrıcalıklara sahip olması gerekir.
userInfo
komutunu çalıştırırken, belirtilen seçeneklere bağlı olarak aşağıdaki bilgileri alabilirsiniz:
{ "users" : [ { "_id" : "<db>.<username>", "userId" : <UUID>, // Starting in MongoDB 4.0.9 "user" : "<username>", "db" : "<db>", "mechanisms" : [ ... ], // Starting in MongoDB 4.0 "customData" : <document>, "roles" : [ ... ], "credentials": { ... }, // only if showCredentials: true "inheritedRoles" : [ ... ], // only if showPrivileges: true or showAuthenticationRestrictions: true "inheritedPrivileges" : [ ... ], // only if showPrivileges: true or showAuthenticationRestrictions: true "inheritedAuthenticationRestrictions" : [ ] // only if showPrivileges: true or showAuthenticationRestrictions: true "authenticationRestrictions" : [ ... ] // only if showAuthenticationRestrictions: true }, ], "ok" : 1 }
Artık usersInfo
komutuyla neler başarabileceğinize dair genel bir fikre sahip olduğunuza göre, ortaya çıkabilecek bir sonraki soru, belirli kullanıcılara ve birden çok kullanıcıya bakmak için hangi komutların kullanışlı olacağıdır.
Aynı şeyi göstermek için iki kullanışlı örnek:
"Ofis" veritabanında tanımlanan bir "Anthony" kullanıcısının kimlik bilgilerine değil, belirli kullanıcılara yönelik belirli ayrıcalıklara ve bilgilere bakmak için aşağıdaki komutu yürütün:
db.runCommand( { usersInfo: { user: "Anthony", db: "office" }, showPrivileges: true } )
Mevcut veritabanında bir kullanıcıya bakmak istiyorsanız, kullanıcıdan sadece ismiyle bahsedebilirsiniz. Örneğin, ana veritabanındaysanız ve ana veritabanında “Timothy” adlı bir kullanıcı varsa, aşağıdaki komutu çalıştırabilirsiniz:
db.getSiblingDB("home").runCommand( { usersInfo: "Timothy", showPrivileges: true } )
Ardından, çeşitli kullanıcılar için bilgilere bakmak isterseniz bir dizi kullanabilirsiniz. İsteğe bağlı showCredentials
ve showPrivileges
alanlarını ekleyebilir veya bunları dışarıda bırakmayı seçebilirsiniz. Komut şöyle görünecek:
db.runCommand({ usersInfo: [ { user: "Anthony", db: "office" }, { user: "Timothy", db: "home" } ], showPrivileges: true })
Kullanıcıdan Rolleri iptal et
Rollerin bulunduğu veritabanındaki bir kullanıcıdan bir veya daha fazla rolü kaldırmak için revokeRolesFromUser
komutundan yararlanabilirsiniz. revokeRolesFromUser
komutu aşağıdaki sözdizimine sahiptir:
db.runCommand( { revokeRolesFromUser: "<user>", roles: [ { role: "<role>", db: "<database>" } | "<role>", ], writeConcern: { <write concern> }, comment: <any> } )
Yukarıda bahsedilen söz diziminde, roles
alanında hem kullanıcı tanımlı hem de yerleşik roller belirtebilirsiniz. grantRolesToUser
komutuna benzer şekilde, bir belgede iptal etmek istediğiniz rolü belirtebilir veya adını kullanabilirsiniz.
revokeRolesFromUser
komutunu başarıyla yürütmek için, belirtilen veritabanında revokeRole
eylemine sahip olmanız gerekir.
İşte noktayı eve götürmek için bir örnek. Ürünler veritabanındaki productUser00
varlığı aşağıdaki rollere sahipti:
"roles" : [ { "role" : "assetsWriter", "db" : "assets" }, { "role" : "readWrite", "db" : "stock" }, { "role" : "read", "db" : "products" } ]
Aşağıdaki revokeRolesFromUser
komutu, kullanıcının rollerinden ikisini kaldıracaktır: products
"okuma" rolü ve "varlıklar" veritabanından assetsWriter
rolü:
use products db.runCommand( { revokeRolesFromUser: "productUser00", roles: [ { role: "AssetsWriter", db: "assets" }, "read" ], writeConcern: { w: "majority" } } )
Ürün veritabanındaki "productUser00" kullanıcısının artık yalnızca bir rolü var:

"roles" : [ { "role" : "readWrite", "db" : "stock" } ]
Rol Yönetimi Komutları
Roller, kullanıcılara kaynaklara erişim sağlar. Yöneticiler tarafından bir MongoDB sistemine erişimi kontrol etmek için birkaç yerleşik rol kullanılabilir. Roller istenen ayrıcalıkları kapsamıyorsa, belirli bir veritabanında yeni roller oluşturmak için daha da ileri gidebilirsiniz.
DropRol
dropRole
komutu ile komutu çalıştırdığınız veri tabanından kullanıcı tanımlı bir rolü silebilirsiniz. Bu komutu yürütmek için aşağıdaki sözdizimini kullanın:
db.runCommand( { dropRole: "<role>", writeConcern: { <write concern> }, comment: <any> } )
Başarılı yürütme için, belirtilen veritabanında dropRole
eylemine sahip olmanız gerekir. Aşağıdaki işlemler writeTags
rolünü "ürünler" veritabanından kaldırır:
use products db.runCommand( { dropRole: "writeTags", writeConcern: { w: "majority" } } )
oluşturmakRol
Bir rol oluşturmak ve ayrıcalıklarını belirtmek için createRole
komutundan yararlanabilirsiniz. Rol, komutu çalıştırmayı seçtiğiniz veritabanına uygulanacaktır. Rol zaten veritabanında mevcutsa, createRole
komutu yinelenen bir rol hatası döndürür.
Bu komutu yürütmek için verilen sözdizimini izleyin:
db.adminCommand( { createRole: "<new role>", privileges: [ { resource: { <resource> }, actions: [ "<action>", ... ] }, ], roles: [ { role: "<role>", db: "<database>" } | "<role>", ], authenticationRestrictions: [ { clientSource: ["<IP>" | "<CIDR range>", ...], serverAddress: ["<IP>" | "<CIDR range>", ...] }, ], writeConcern: <write concern document>, comment: <any> } )
Bir rolün ayrıcalıkları, rolün oluşturulduğu veritabanına uygulanır. Rol, veritabanındaki diğer rollerden ayrıcalıkları devralabilir. Örneğin, “yönetici” veritabanında yapılan bir rol, bir küme veya tüm veritabanları için geçerli olan ayrıcalıklar içerebilir. Ayrıca, diğer veritabanlarında bulunan rollerden ayrıcalıkları devralabilir.
Bir veritabanında rol oluşturmak için iki şeye sahip olmanız gerekir:
- Yeni rolün ayrıcalıklarından ve devralınacak rollerden bahsetmek için bu veritabanındaki
grantRole
eylemi. - Bu veritabanı kaynağındaki
createRole
eylemi.
Aşağıdaki createRole
komutu, kullanıcı veritabanında bir clusterAdmin
rolü oluşturacaktır:
db.adminCommand({ createRole: "clusterAdmin", privileges: [ { resource: { cluster: true }, actions: [ "addShard" ] }, { resource: { db: "config", collection: "" }, actions: [ "find", "remove" ] }, { resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert" ] }, { resource: { db: "", collection: "" }, actions: [ "find" ] } ], roles: [ { role: "read", db: "user" } ], writeConcern: { w: "majority" , wtimeout: 5000 } })
hibeRollerToRol
grantRolesToRole
komutuyla, kullanıcı tanımlı bir role roller atayabilirsiniz. grantRolesToRole
komutu, komutun yürütüldüğü veritabanındaki rolleri etkiler.
Bu grantRolesToRole
komutu aşağıdaki sözdizimine sahiptir:
db.runCommand( { grantRolesToRole: "<role>", roles: [ { role: "<role>", db: "<database>" }, ], writeConcern: { <write concern> }, comment: <any> } )
Erişim ayrıcalıkları, grantRolesToUser
komutuna benzer - komutun doğru şekilde yürütülmesi için bir veritabanında grantRole
eylemine ihtiyacınız vardır.
Aşağıdaki örnekte, " productsReader
" veritabanındaki productReader rolünü, productsWriter
rolünün ayrıcalıklarını devralacak şekilde güncellemek için grantRolesToUser
komutunu kullanabilirsiniz:
use products db.runCommand( { grantRolesToRole: "productsReader", roles: [ "productsWriter" ], writeConcern: { w: "majority" , wtimeout: 5000 } } )
iptalAyrıcalıklarRolden
Komutun yürütüldüğü veritabanındaki kullanıcı tanımlı rolden belirtilen ayrıcalıkları kaldırmak için revokePrivilegesFromRole
kullanabilirsiniz. Doğru yürütme için aşağıdaki sözdizimini aklınızda tutmanız gerekir:
db.runCommand( { revokePrivilegesFromRole: "<role>", privileges: [ { resource: { <resource> }, actions: [ "<action>", ... ] }, ], writeConcern: <write concern document>, comment: <any> } )
Bir ayrıcalığı iptal etmek için "kaynak belge" kalıbı, o ayrıcalığın "kaynak" alanıyla eşleşmelidir. "İşlemler" alanı, tam bir eşleşme veya bir alt küme olabilir.
Örneğin, kaynak olarak "yönetici" veritabanını belirten aşağıdaki ayrıcalıklara sahip olan ürünler veritabanındaki manageRole
rolünü düşünün:
{ "resource" : { "db" : "managers", "collection" : "" }, "actions" : [ "insert", "remove" ] }
Yöneticiler veritabanındaki yalnızca bir koleksiyondan "ekleme" veya "kaldırma" eylemlerini iptal edemezsiniz. Aşağıdaki işlemler rolde herhangi bir değişikliğe neden olmaz:
use managers db.runCommand( { revokePrivilegesFromRole: "manageRole", privileges: [ { resource : { db : "managers", collection : "kiosks" }, actions : [ "insert", "remove" ] } ] } )
db.runCommand( { revokePrivilegesFromRole: "manageRole", privileges: [ { resource : { db : "managers", collection : "kiosks" }, actions : [ "insert" ] } ] } )
manageRole
rolünden "ekleme" ve/veya "kaldırma" eylemlerini iptal etmek için kaynak belgeyi tam olarak eşleştirmeniz gerekir. Örneğin, aşağıdaki işlem, mevcut ayrıcalıktan yalnızca "kaldır" eylemini iptal eder:
use managers db.runCommand( { revokePrivilegesFromRole: "manageRole", privileges: [ { resource : { db : "managers", collection : "" }, actions : [ "remove" ] } ] } )
Aşağıdaki işlem, yöneticiler veritabanındaki "yönetici" rolünden birden çok ayrıcalığı kaldıracaktır:
use managers db.runCommand( { revokePrivilegesFromRole: "executive", privileges: [ { resource: { db: "managers", collection: "" }, actions: [ "insert", "remove", "find" ] }, { resource: { db: "managers", collection: "partners" }, actions: [ "update" ] } ], writeConcern: { w: "majority" } } )
rollerBilgi
rolesInfo
komutu, hem yerleşik hem de kullanıcı tanımlı roller dahil olmak üzere belirtilen roller için ayrıcalık ve devralma bilgilerini döndürür. Ayrıca, bir veritabanı kapsamındaki tüm rolleri almak için rolesInfo
komutundan yararlanabilirsiniz.
Düzgün yürütme için şu sözdizimini izleyin:
db.runCommand( { rolesInfo: { role: <name>, db: <db> }, showPrivileges: <Boolean>, showBuiltinRoles: <Boolean>, comment: <any> } )
Geçerli veritabanından bir rol için bilgi döndürmek için adını aşağıdaki gibi belirleyebilirsiniz:
{ rolesInfo: "<rolename>" }
Başka bir veritabanından bir rol için bilgi döndürmek için, rolden ve veritabanından bahseden bir belgeyle rolden bahsedebilirsiniz:
{ rolesInfo: { role: "<rolename>", db: "<database>" } }
Örneğin, aşağıdaki komut, yöneticiler veritabanında tanımlanan rol yöneticisi için rol devralma bilgilerini döndürür:
db.runCommand( { rolesInfo: { role: "executive", db: "managers" } } )
Bu sonraki komut, komutun yürütüldüğü veritabanındaki rol devralma bilgilerini döndürür: accountManager
:
db.runCommand( { rolesInfo: "accountManager" } )
Aşağıdaki komut, yöneticiler veritabanında tanımlandığı gibi "yönetici" rolü için hem ayrıcalıkları hem de rol devralmalarını döndürür:
db.runCommand( { rolesInfo: { role: "executive", db: "managers" }, showPrivileges: true } )
Birden çok rolden bahsetmek için bir dizi kullanabilirsiniz. Ayrıca dizideki her rolden bir dize veya belge olarak da bahsedebilirsiniz.
Yalnızca, rolün, komutun yürütüldüğü veritabanında mevcut olması durumunda bir dize kullanmalısınız:
{ rolesInfo: [ "<rolename>", { role: "<rolename>", db: "<database>" }, ] }
Örneğin, aşağıdaki komut, üç farklı veritabanındaki üç rol için bilgi döndürür:
db.runCommand( { rolesInfo: [ { role: "executive", db: "managers" }, { role: "accounts", db: "departments" }, { role: "administrator", db: "products" } ] } )
Hem ayrıcalıkları hem de rol mirasını aşağıdaki gibi alabilirsiniz:
db.runCommand( { rolesInfo: [ { role: "executive", db: "managers" }, { role: "accounts", db: "departments" }, { role: "administrator", db: "products" } ], showPrivileges: true } )
Daha İyi Performans için MongoDB Belgelerini Gömme
MongoDB gibi belge veritabanları, şemanızı ihtiyaçlarınıza göre tanımlamanıza izin verir. MongoDB'de en uygun şemaları oluşturmak için belgeleri iç içe yerleştirebilirsiniz. Bu nedenle, uygulamanızı bir veri modeliyle eşleştirmek yerine, kullanım durumunuza uygun bir veri modeli oluşturabilirsiniz.
Gömülü belgeler, birlikte eriştiğiniz ilgili verileri depolamanıza olanak tanır. MongoDB için şemalar tasarlarken, varsayılan olarak belgeleri gömmeniz önerilir. Veritabanı tarafı veya uygulama tarafı birleştirmeleri ve referansları yalnızca faydalı olduklarında kullanın.
İş yükünün bir belgeyi gerektiği kadar sık alabileceğinden emin olun. Aynı zamanda, belgenin ihtiyaç duyduğu tüm verilere de sahip olması gerekir. Bu, uygulamanızın olağanüstü performansı için çok önemlidir.
Aşağıda, belgeleri gömmek için birkaç farklı desen bulacaksınız:
Gömülü Belge Kalıbı
Bunu, karmaşık alt yapıları bile kullanıldıkları belgelere gömmek için kullanabilirsiniz. Bağlı verileri tek bir belgeye gömmek, veri almak için gereken okuma işlemlerinin sayısını azaltabilir. Genel olarak şemanızı, uygulamanızın gerekli tüm bilgileri tek bir okuma işleminde alacak şekilde yapılandırmanız gerekir. Bu nedenle, burada akılda tutulması gereken kural, birlikte kullanılanların birlikte saklanması gerektiğidir .
Gömülü Alt Küme Kalıbı
Gömülü alt küme modeli, karma bir durumdur. Bunu, bu öğelerin bazılarını sergilemek üzere el altında tutabileceğiniz, ilgili öğelerin uzun bir listesinin ayrı bir koleksiyonu için kullanırsınız.
Film incelemelerini listeleyen bir örnek:
> db.movie.findOne() { _id: 321475, title: "The Dark Knight" } > db.review.find({movie_id: 321475}) { _id: 264579, movie_id: 321475, stars: 4 text: "Amazing" } { _id: 375684, movie_id: 321475, stars:5, text: "Mindblowing" }
Şimdi, benzer binlerce incelemeyi gözünüzde canlandırın, ancak bir film gösterirken yalnızca en son ikisini görüntülemeyi planlıyorsunuz. Bu senaryoda, bu alt kümeyi film belgesinde bir liste olarak saklamak mantıklıdır:
> db.movie.findOne({_id: 321475}) { _id: 321475, title: "The Dark Knight", recent_reviews: [ {_id: 264579, stars: 4, text: "Amazing"}, {_id: 375684, stars: 5, text: "Mindblowing"} ] }</code
Basitçe söylemek gerekirse, ilgili öğelerin bir alt kümesine rutin olarak erişiyorsanız, onu yerleştirdiğinizden emin olun.
Bağımsız Erişim
Alt belgeleri, üst koleksiyonlarından ayırmak için koleksiyonlarında saklamak isteyebilirsiniz.
Örneğin, bir şirketin ürün hattını alın. Şirket küçük bir ürün grubu satıyorsa, bunları şirket belgesinde saklamak isteyebilirsiniz. Ancak bunları şirketler arasında yeniden kullanmak veya stok tutma birimlerinden (SKU) doğrudan erişmek istiyorsanız, onları koleksiyonlarında da saklamak istersiniz.
Bir varlığı bağımsız olarak değiştirir veya erişirseniz, en iyi uygulama için ayrı olarak depolamak üzere bir koleksiyon oluşturun.
Sınırsız Listeler
İlgili bilgilerin kısa listelerini belgelerinde saklamanın bir dezavantajı vardır. Listeniz denetlenmeden büyümeye devam ederse, onu tek bir belgeye koymamalısınız. Bunun nedeni, onu çok uzun süre destekleyemeyecek olmanızdır.
Bunun iki nedeni var. İlk olarak, MongoDB'nin tek bir belgenin boyutu üzerinde bir sınırı vardır. İkincisi, belgeye çok fazla frekansta erişirseniz, kontrolsüz bellek kullanımından kaynaklanan olumsuz sonuçlar görürsünüz.
Basitçe söylemek gerekirse, bir liste sınırsızca büyümeye başlarsa, onu ayrı olarak saklamak için bir koleksiyon yapın.
Extended Reference Pattern
The extended reference pattern is like the subset pattern. It also optimizes information that you regularly access to store on the document.
Here, instead of a list, it's leveraged when a document refers to another that is present in the same collection. At the same time, it also stores some fields from that other document for ready access.
For instance:
> db.movie.findOne({_id: 245434}) { _id: 245434, title: "Mission Impossible 4 - Ghost Protocol", studio_id: 924935, studio_name: "Paramount Pictures" }
As you can see, “the studio_id” is stored so that you can look up more information on the studio that created the film. But the studio's name is also copied to this document for simplicity.
To embed information from modified documents regularly, remember to update documents where you've copied that information when it is modified. In other words, if you routinely access some fields from a referenced document, embed them.
How To Monitor MongoDB
You can use monitoring tools like Kinsta APM to debug long API calls, slow database queries, long external URL requests, to name a few. You can even leverage commands to improve database performance. You can also use them to inspect the ase/” data-mce-href=”https://kinsta.com/knowledgebase/wordpress-repair-database/”>health of your database instances.
Why Should You Monitor MongoDB Databases?
A key aspect of database administration planning is monitoring your cluster's performance and health. MongoDB Atlas handles the majority of administration efforts through its fault-tolerance/scaling abilities.
Despite that, users need to know how to track clusters. They should also know how to scale or tweak whatever they need before hitting a crisis.
By monitoring MongoDB databases, you can:
- Observe the utilization of resources.
- Understand the current capacity of your database.
- React and detect real-time issues to enhance your application stack.
- Observe the presence of performance issues and abnormal behavior.
- Align with your governance/data protection and service-level agreement (SLA) requirements.
Key Metrics To Monitor
While monitoring MongoDB, there are four key aspects you need to keep in mind:
1. MongoDB Hardware Metrics
Here are the primary metrics for monitoring hardware:
Normalized Process CPU
It's defined as the percentage of time spent by the CPU on application software maintaining the MongoDB process.
You can scale this to a range of 0-100% by dividing it by the number of CPU cores. It includes CPU leveraged by modules such as kernel and user.
High kernel CPU might show exhaustion of CPU via the operating system operations. But the user linked with MongoDB operations might be the root cause of CPU exhaustion.
Normalized System CPU
It's the percentage of time the CPU spent on system calls servicing this MongoDB process. You can scale it to a range of 0-100% by dividing it by the number of CPU cores. It also covers the CPU used by modules such as iowait, user, kernel, steal, etc.
User CPU or high kernel might show CPU exhaustion through MongoDB operations (software). High iowait might be linked to storage exhaustion causing CPU exhaustion.
Disk IOPS
Disk IOPS is the average consumed IO operations per second on MongoDB's disk partition.
Disk Latency
This is the disk partition's read and write disk latency in milliseconds in MongoDB. High values (>500ms) show that the storage layer might affect MongoDB's performance.
System Memory
Use the system memory to describe physical memory bytes used versus available free space.
The available metric approximates the number of bytes of system memory available. You can use this to execute new applications, without swapping.
Disk Space Free
This is defined as the total bytes of free disk space on MongoDB's disk partition. MongoDB Atlas provides auto-scaling capabilities based on this metric.
Swap Usage
You can leverage a swap usage graph to describe how much memory is being placed on the swap device. A high used metric in this graph shows that swap is being utilized. This shows that the memory is under-provisioned for the current workload.
MongoDB Cluster's Connection and Operation Metrics
Here are the main metrics for Operation and Connection Metrics:
Operation Execution Times
The average operation time (write and read operations) performed over the selected sample period.
Opcounters
It is the average rate of operations executed per second over the selected sample period. Opcounters graph/metric shows the operations breakdown of operation types and velocity for the instance.
Bağlantılar
This metric refers to the number of open connections to the instance. High spikes or numbers might point to a suboptimal connection strategy either from the unresponsive server or the client side.
Query Targeting and Query Executors
This is the average rate per second over the selected sample period of scanned documents. For query executors, this is during query-plan evaluation and queries. Query targeting shows the ratio between the number of documents scanned and the number of documents returned.
Yüksek bir sayı oranı, optimal olmayan işlemlere işaret eder. Bu işlemler, daha küçük bir parça döndürmek için çok sayıda belgeyi tarar.
Tara ve Sipariş Et
Seçilen örnek sorgu dönemi boyunca saniye başına ortalama hızı tanımlar. Bir dizin kullanarak sıralama işlemini gerçekleştiremeyen sıralanmış sonuçları döndürür.
Kuyruklar
Kuyruklar, bir kilit için bekleyen işlemlerin sayısını, yazma veya okuma olarak tanımlayabilir. Yüksek kuyruklar, optimalden daha az şema tasarımının varlığını gösterebilir. Ayrıca, veritabanı kaynakları üzerinde yüksek rekabeti zorlayarak çakışan yazma yollarını da gösterebilir.
MongoDB Replikasyon Metrikleri
Çoğaltma izleme için birincil metrikler şunlardır:
Çoğaltma İşlem Günlüğü Penceresi
Bu ölçüm, birincilin çoğaltma işlem günlüğünde kullanılabilen yaklaşık saat sayısını listeler. Bir ikincil bu miktardan daha fazla gecikirse, devam edemez ve tam bir yeniden eşitlemeye ihtiyaç duyar.
Çoğaltma Gecikmesi
Çoğaltma gecikmesi, yazma işlemlerinde ikincil bir düğümün birincil düğümün arkasında olduğu yaklaşık saniye sayısı olarak tanımlanır. Yüksek çoğaltma gecikmesi, çoğaltmada zorluk çeken bir ikincil öğeye işaret eder. Bağlantıların okuma/yazma endişesi göz önüne alındığında, işleminizin gecikmesini etkileyebilir.
Çoğaltma Boşluğu
Bu ölçüm, birincil çoğaltmanın oplog penceresi ile ikincil çoğaltma gecikmesi arasındaki farkı ifade eder. Bu değerin sıfıra inmesi sekonderin KURTARMA moduna geçmesine neden olabilir.
Muhalifler - repl
Opcounters -repl, seçilen örnekleme periyodu için saniyede yürütülen çoğaltma işlemlerinin ortalama hızı olarak tanımlanır. Opcounters -graph/metric ile, belirtilen örnek için işlem hızlarına ve işlem türlerinin dökümüne göz atabilirsiniz.
Oplog GB/Saat
Bu, birincilin saatte oluşturduğu gigabaytlarca oplog'un ortalama hızı olarak tanımlanır. Beklenmeyen yüksek hacimli oplog, son derece yetersiz bir yazma iş yüküne veya bir şema tasarımı sorununa işaret edebilir.
MongoDB Performans İzleme Araçları
MongoDB, performans takibi için Cloud Manager, Atlas ve Ops Manager'da yerleşik kullanıcı arabirimi araçlarına sahiptir. Ayrıca, daha ham tabanlı verilere bakmak için bazı bağımsız komutlar ve araçlar sağlar. Ortamınızı kontrol etmek için erişime ve uygun rollere sahip bir ana bilgisayardan çalıştırabileceğiniz bazı araçlar hakkında konuşacağız:
mongotop
Bir MongoDB örneğinin koleksiyon başına veri yazmak ve okumak için harcadığı süreyi izlemek için bu komuttan yararlanabilirsiniz. Aşağıdaki sözdizimini kullanın:
mongotop <options> <connection-string> <polling-interval in seconds>
rs.durum()
Bu komut, çoğaltma kümesi durumunu döndürür. Yöntemin yürütüldüğü üyenin bakış açısından yürütülür.
mongostat
MongoDB sunucu anınızın durumuna hızlı bir genel bakış elde etmek için mongostat
komutunu kullanabilirsiniz. Optimum çıktı için, gerçek zamanlı bir görünüm sunduğundan belirli bir olayın tek bir örneğini izlemek için kullanabilirsiniz.
Kilit kuyrukları, işlem arızası, MongoDB bellek istatistikleri ve bağlantılar/ağ gibi temel sunucu istatistiklerini izlemek için bu komuttan yararlanın:
mongostat <options> <connection-string> <polling interval in seconds>
dbStats
Bu komut, belirli bir veritabanı için dizin sayısı ve boyutları, toplam toplama verileri ve depolama boyutu ve koleksiyonla ilgili istatistikler (koleksiyon ve belge sayısı) gibi depolama istatistiklerini döndürür.
db.serverStatus()
Veritabanının durumuna genel bir bakış için db.serverStatus()
komutundan yararlanabilirsiniz. Size mevcut örnek metrik sayaçlarını temsil eden bir belge verir. Örnekle ilgili istatistikleri toplamak için bu komutu düzenli aralıklarla yürütün.
collStats
collStats
komutu, toplama düzeyinde dbStats
tarafından sunulana benzer istatistikleri toplar. Çıktısı, koleksiyondaki nesnelerin sayısından, koleksiyon tarafından tüketilen disk alanı miktarından, koleksiyonun boyutundan ve belirli bir koleksiyon için dizinleriyle ilgili bilgilerden oluşur.
Tüm bu komutları, veritabanı performansını ve hatalarını izlemenize ve bir veritabanını iyileştirmek için bilinçli karar vermeye yardımcı olmanıza olanak tanıyan veritabanı sunucusunun gerçek zamanlı raporlamasını ve izlenmesini sunmak için kullanabilirsiniz.
MongoDB Veritabanı Nasıl Silinir
MongoDB'de oluşturduğunuz bir veritabanını bırakmak için use anahtar sözcüğü ile ona bağlanmanız gerekir.
“Mühendisler” adında bir veritabanı oluşturduğunuzu varsayalım. Veritabanına bağlanmak için aşağıdaki komutu kullanacaksınız:
use Engineers
Ardından, bu veritabanından kurtulmak için db.dropDatabase()
yazın. Yürütmeden sonra, beklediğiniz sonuç budur:
{ "dropped" : "Engineers", "ok" : 1 }
Veritabanının hala var olup olmadığını doğrulamak için showdbs
komutunu çalıştırabilirsiniz.
Özet
MongoDB'den her bir değer damlasını sıkıştırmak için temelleri güçlü bir şekilde anlamanız gerekir. Bu nedenle, MongoDB veritabanlarını avucunuzun içi gibi bilmek çok önemlidir. Bu, önce bir veritabanı oluşturma yöntemlerine aşina olmanızı gerektirir.
Bu makalede, MongoDB'de bir veritabanı oluşturmak için kullanabileceğiniz farklı yöntemlere ışık tuttuk ve ardından, sizi veritabanlarınızın zirvesinde tutmak için bazı şık MongoDB komutlarının ayrıntılı bir açıklamasını izledik. Son olarak, iş akışı işlevlerinizin en yüksek verimlilikte olmasını sağlamak için MongoDB'deki yerleşik belgelerden ve performans izleme araçlarından nasıl yararlanabileceğinizi tartışarak tartışmayı tamamladık.
Bu MongoDB komutlarına ne dersiniz? Burada görmek isteyeceğiniz bir yönü veya yöntemi kaçırdık mı? Yorumlarda bize bildirin!