mongosh (MongoDB Shell), MongoDB sunucularına bağlanıp sorgu çalıştırmanızı, veriyi incelemenizi ve yönetim komutları vermenizi sağlayan, JavaScript ve Node.js tabanlı etkileşimli bir kabuktur (REPL). En basit kullanımı terminalde mongosh yazmaktır; bu komut localhost üzerinde 27017 portunda çalışan sunucuya bağlanır. Uzak sunucu için bağlantı adresini (mongosh "mongodb://sunucu:27017") veya --host ve --port seçeneklerini kullanırsınız.

Bu yazıda bağlantı seçeneklerini, kabuk içindeki temel komutları ve yardım sistemini, --eval ile tek satırlık komutları, .js betiklerini, .mongoshrc.js başlangıç dosyasını ve config API'sini anlatıyoruz. mongosh 2.14 belgeleri esas alındı; mongosh MongoDB 7.0 ve üzeri sürümlere bağlanabilir. Serinin geri kalanı için MongoDB öğrenme rehberine bakın.

mongosh nasıl kurulur?

Ubuntu'da resmî mongodb-org paketi mongodb-mongosh paketini de getirir, ayrıca bir şey kurmanız gerekmez (Ubuntu kurulumu). Windows'ta ise sunucu kurulumu mongosh içermez; mongosh'u MSI paketiyle ayrıca kurarsınız (Windows kurulumu). Kurulumu doğrulamak için:

bash
mongosh --version

Bir sunucuya bağlanmak

Bir sunucuya bağlanmak: Kimlik doğrulamalı bağlantı, TLS ve replica set bağlantıları

mongosh'u seçeneksiz çalıştırmak, aşağıdaki iki komuttan ikincisiyle aynı şeydir. Port farklıysa adresi yazabilir ya da --port verebilirsiniz:

bash
mongosh
mongosh "mongodb://localhost:27017"
mongosh --port 28015
mongosh --host db.ornek.com --port 28015

--port verilmezse mongosh 27017 portunu dener; --host verilmezse localhost'a bağlanır. Bağlantı adresinin yolunda bir veritabanı adı belirtirseniz o veritabanı varsayılan olur; belirtmezseniz varsayılan veritabanı test'tir. Adresin tüm parçaları ve seçenekleri connection string yazısında anlatılıyor.

Kimlik doğrulamalı bağlantı

Erişim denetimi açık bir sunucuya bağlanmak için --username ve --authenticationDatabase seçeneklerini kullanın. mongosh parolayı sorar ve siz yazarken gizler:

bash
mongosh "mongodb://db.ornek.com:27017" --username yonetici --authenticationDatabase admin

Parolayı komutun içinde vermek için --password (kısa biçimi -p) vardır ve belgeler bunu betik gibi programatik kullanım için anlatır. --password seçeneğini en sona, değer vermeden yazarsanız mongosh yine parola sorar. Parolayı komut satırına yazmanın riskini azaltmak için belgelerdeki ipucu şudur: bash ve zsh gibi kabuklarda boşlukla başlayan komutlar geçmişe kaydedilmez.

TLS ve replica set bağlantıları

TLS için adrese ?tls=true ekleyebilir veya --tls seçeneğini verebilirsiniz. mongodb+srv:// biçimi TLS'i otomatik olarak açar. Replica set'e bağlanırken üyeleri ve replicaSet adını adrese yazabilirsiniz:

bash
mongosh "mongodb://db1.ornek.com:27017,db2.ornek.com:27017,db3.ornek.com:27017/?replicaSet=rs0"
mongosh "mongodb://db1.ornek.com:27017" --tls

Bağlı olduğunuz adresi görmek için db.getMongo() kullanılır; yöntem geçerli bağlantının connection string'ini döndürür. Kabuktan çıkmak için .exit, exit, exit(), quit veya quit() yazabilir, Ctrl + D tuşlarına ya da iki kez Ctrl + C tuşlarına basabilirsiniz.

Kabuk içindeki temel komutlar

mongosh'ta db değişkeni geçerli veritabanını temsil eder. Aşağıdaki komutlar günlük kullanımın büyük kısmını oluşturur:

javascript
db
use magaza
show dbs
show collections
db.urunler.insertOne( { ad: "Kalem", stok: 120 } )
db.urunler.find( { stok: { $gt: 100 } } )
KomutNe yapar
dbKullandığınız veritabanının adını gösterir (varsayılan test)
use <veritabanı>Veritabanına geçer; yoksa ilk yazmada oluşturulur
show dbs veya show databasesKullanıcının erişebildiği veritabanlarını listeler
show collectionsGeçerli veritabanındaki koleksiyonları listeler
db.getSiblingDB("ad")Geçerli veritabanını değiştirmeden başka bir veritabanına erişir
cls, Ctrl + L, console.clear()Konsolu temizler
Ctrl + CÇalışan komutu keser, istemi geri getirir

show collections çıktısı, bir koleksiyonun view mi yoksa time series koleksiyonu mu olduğunu adın yanında [view] veya [time-series] etiketiyle belirtir. show dbs listesi, kullanıcınızın yetkilerine göre değişir. Koleksiyon oluşturma kuralları için veritabanı ve koleksiyon oluşturma yazısına bakın.

Ctrl + C ne zaman işe yaramaz?

Ctrl + C tuşlarına bir kez bastığınızda mongosh etkin komutu keser, sunucu tarafındaki işlemi sonlandırmaya çalışır ve istemi geri getirir; işlemi temiz biçimde durduramazsa uyarı verir. Ancak setTimeout gibi asenkron kodu durdurmaz; bu, Node.js REPL ile aynı davranıştır. Bir kez basmak kabuktan çıkarmaz, iki kez basmak çıkarır. Sonucu { ok: 0 } içeren komutlarda mongosh, sunucunun ham çıktısı yerine tutarlı bir istisna (exception) gösterir.

Yardım sistemi

mongosh'ta hemen her nesnenin yardımı vardır ve .help() ile .help birbirinin yerine kullanılabilir. Komut satırı seçenekleri için mongosh --help, kabuk komutları için help kullanılır:

javascript
help
db.help()
db.adminCommand.help()
db.urunler.help()
db.urunler.insertOne.help()
db.urunler.find().help()

db.help() veritabanı yöntemlerini, db.urunler.help() koleksiyon yöntemlerini, db.urunler.find().help() ise imleç (cursor) yöntemlerini listeler. Koleksiyon yardımı için koleksiyonun var olması gerekmez. Bir yöntemi parantezsiz yazarsanız (db.urunler.insertOne) mongosh o yöntemin desteklediği sunucu sürümleri ve topolojiler gibi ayrıntılarını gösterir.

--eval ile tek satırda komut çalıştırmak

Kabuğa girmeden bir ifade çalıştırmak için --eval kullanılır. Birden fazla --eval verebilirsiniz; mongosh hepsini sırayla çalıştırır ama yalnızca sonuncusunun sonucunu yazdırır. Etkileşimli olmayan oturumlarda --quiet varsayılan olarak açıktır; açılış mesajlarını görmek isterseniz --no-quiet verin:

bash
mongosh --quiet --eval 'use magaza' --eval 'show collections' mongodb://localhost/
mongosh --quiet --json=relaxed --eval 'use magaza' --eval 'db.urunler.findOne()' mongodb://localhost/

--json bayrağı sonucu Extended JSON olarak verir; --json=canonical ve --json=relaxed modları vardır ve mod yazılmazsa canonical kullanılır. Otomatik işlenecek çıktı için belgeler EJSON.stringify() kullanmayı önerir. --json ile --shell birlikte kullanılamaz; --shell, betik veya --eval bittikten sonra sizi kabuk istemine bırakır. Extended JSON'un iki modu BSON veri tipleri yazısında karşılaştırılıyor.

JavaScript betikleri çalıştırmak

JavaScript betikleri çalıştırmak: --file veya -f, --nodb, load(), exit(kod)

Tekrarlanan işleri bir .js dosyasına yazabilirsiniz. Örneğin stok-raporu.js:

javascript
db = connect( "mongodb://localhost/magaza" );
const azalan = db.urunler.countDocuments( { stok: { $lt: 10 } } );
if ( azalan > 50 ) {
  print( "Uyarı: çok sayıda ürünün stoğu azaldı" );
  exit( 1 );
}
printjson( db.urunler.find( { stok: { $lt: 10 } }, { _id: 0, ad: 1, stok: 1 } ) );

Bu betik magaza veritabanına bağlanır, stoğu 10'dan az olan ürünleri sayar, sayı beklenenden büyükse exit(1) ile durur, değilse listeyi yazdırır. Betikteki find() sonucunu ekranda görmek için belgeler printjson() kullanmayı önerir. Betiği iki şekilde çalıştırabilirsiniz:

bash
mongosh --file stok-raporu.js
mongosh --nodb --file stok-raporu.js
javascript
load( "stok-raporu.js" )
  • --file veya -f: Betiği kabuğa girmeden çalıştırır; birden fazla dosya verilebilir. Dosya adını bayraksız verirseniz, başka argümanlar da varsa bağlantı başarısız olabilir; bu yüzden belgeler her zaman --file veya -f kullanmayı önerir.
  • --nodb: mongosh'un hiçbir sunucuya bağlanmadan başlamasını sağlar. Bağlantı bilgisi betiğin içinde connect() ile verilmişse bu seçenek uygundur.
  • load(): Kabuk içinden bir dosyayı çalıştırır; göreli ve mutlak yolları kabul eder. Bir arama yolu yoktur: dosya geçerli çalışma dizininde veya verdiğiniz tam yolda değilse bulunamaz.
  • exit(kod): Betiği belirli bir noktada durdurur. Belgeler kodu try ve catch bloğuna alıp catch içinde exit çağırmayı iyi uygulama olarak önerir.

Taşınabilirlik için bağlantı bilgisini betiğe gömmek yerine komut satırında verip betikte db.getSiblingDB() ile veritabanı seçebilirsiniz. Böylece aynı betiği başka bir sunucuda yalnızca komut satırını değiştirerek çalıştırırsınız:

javascript
db = db.getSiblingDB( "magaza" );
printjson( db.urunler.countDocuments( {} ) );
bash
mongosh --host db.ornek.com --port 27017 --file sayim.js

Kabuğun içinden yeni bağlantı açmak için Mongo() ve connect() yöntemleri de vardır; örneğin conn = Mongo(); db = conn.getDB("magaza"); yerel sunucuya bağlanıp db değişkenini ayarlar.

.mongoshrc.js ile başlangıç ayarları

mongosh açılırken HOME dizininizde .mongoshrc.js adlı bir dosya arar; bulursa istemi ilk kez göstermeden önce içeriğini çalıştırır. --eval veya bir .js dosyası çalıştırdığınızda ise bu dosya, JavaScript işlendikten sonra okunur. Dosyanın yüklenmesini --norc ile engelleyebilirsiniz; --norc ayrıca kurulu snippet'lerin otomatik yüklenmesini de engeller. Örneğin istemde komut sırası göstermek için:

javascript
let komutNo = 1;
prompt = function() {
  return "mongosh " + ( komutNo++ ) + "> ";
};

config API: kabuk ayarları

config API: kabuk ayarları: displayBatchSize, historyLength, redactHistory, showStackTraces

config komutu geçerli ayarları listeler; config.get(), config.set() ve config.reset() tek bir ayarı okur, değiştirir veya varsayılana döndürür. API ile yapılan ayarlar genel yapılandırma dosyasındaki ayarları geçersiz kılar ve kabuk yeniden başlasa da kalıcıdır. Windows'ta tercihler %APPDATA%/mongodb/mongosh dizininde tutulur.

javascript
config.get( "displayBatchSize" )
config.set( "displayBatchSize", 5 )
config.set( "showStackTraces", true )
config.reset( "displayBatchSize" )
AyarVarsayılanAnlamı
displayBatchSize20Her imleç yinelemesinde gösterilen belge sayısı
historyLength1000Geçmiş dosyasında tutulan komut sayısı
redactHistoryremoveHassas komutları geçmişten çıkarma biçimi (keep, remove, remove-redact)
showStackTracesfalseHata mesajıyla birlikte yığın izini gösterme
snippetAutoloadtrueKurulu snippet'leri açılışta yükleme

redactHistory varsayılanı remove olduğu için connect() gibi doğası gereği hassas sayılan komutları içeren satırlar geçmişten çıkarılır; e-posta adresi içeren bir find() gibi satırlar ise yalnızca remove-redact modunda maskelenir. mongosh bu eşleştirmeyi "en iyi çaba" ile yapar; sertifika ve anahtarlar, e-posta adresleri, kullanıcı dizinleri, HTTP(S) adresleri, IP adresleri ve MongoDB connection string'leri gibi kalıpları tanımaya çalışır. Yani bu ayar bir güvenlik garantisi değildir; paylaşılan makinelerde parola içeren komutları geçmişe hiç düşürmemek daha güvenlidir.

Uzun komutlar için editör kullanmak

Çok satırlı bir aggregation pipeline'ını istem satırında düzenlemek zordur. mongosh bunun için iki yol sunar. Birincisi harici editördür: config.set("editor", "vi") ile editörü tanımlarsınız, ardından edit yazarak yeni bir düzenleme oturumu açarsınız. edit komutuna bir değişken adı verirseniz o değişkenin değerini, bir ifade verirseniz (örneğin edit db.urunler.insertMany( [] )) o ifadeyi editörde açar. Editörden çıktığınızda ifade istem satırına kopyalanır ama kendiliğinden çalışmaz; Enter ile çalıştırır, Ctrl + C ile vazgeçersiniz. Editör hem kabuğun dışında hem mongosh içinde tanımlanmışsa mongosh içindeki ayar geçerli olur.

İkinci yol yerleşik .editor komutudur ve basit çok satırlı düzenleme sağlar. Bu editör kodu bir dosyaya kaydetmez; kapattığınızda yazdıklarınız genel kapsama (global scope) yüklenir ve içinde fonksiyon ya da komut çağrısı varsa o anda çalışır. Bu yüzden veri değiştiren komutları .editor içinde yazarken kapatmadan önce son bir kez gözden geçirin.

Sık yapılan hatalar

  • Betik dosyasını bayraksız vermek: Diğer argümanlarla birlikte bağlantı hatasına yol açabilir; --file kullanın.
  • Bağlantı adresinde boolean için 1 veya yes yazmak: mongosh 2.0.0'dan itibaren connection string'deki boolean değerler yalnızca true veya false olabilir.
  • Parolayı açıkça komut geçmişine bırakmak: Parolayı istemle girin ya da komutu boşlukla başlatın.
  • load() ile göreli yolu yanlış dizinde aramak: Arama yolu yoktur; çalışma dizinini veya tam yolu kontrol edin.
  • Tek sunucu adresinin replica set'i keşfedeceğini sanmak: mongosh otomatik directConnection=true ekler; replica set için replicaSet parametresini verin.
  • Ctrl + C ile asenkron kodu durdurmayı beklemek: mongosh asenkron kodu sonlandıramaz.

Sık Sorulan Sorular

mongosh ile eski mongo kabuğu arasındaki fark nedir?

MongoDB 5.0'dan itibaren mongosh, eski mongo kabuğunun yerini aldı. Bazı yöntemler farklı davranır; örneğin ObjectId() yöntemleri ve sayı tipleri mongosh'ta farklı işlenir. Ayrıntılar için BSON veri tipleri yazısına bakın.

Sorgu sonucunda neden yalnızca 20 belge görüyorum?

İmleç belgeleri gruplar halinde döndürür ve mongosh varsayılan olarak her yinelemede 20 belge gösterir. Sayıyı config.set("displayBatchSize", ...) ile değiştirebilirsiniz. Sayfalama için sort, limit ve skip yazısına bakın.

mongosh ile bağlanamıyorum, ne yapmalıyım?

Önce sunucunun çalıştığını ve hangi adres ile portu dinlediğini kontrol edin; paketle kurulan sunucu yalnızca 127.0.0.1'i dinler. Kimlik doğrulama hatalarında --authenticationDatabase değerini kontrol edin. Ayrıntılı tanı adımları bağlantı hataları yazısında.

mongosh ile toplu veri aktarabilir miyim?

Küçük işler için insertMany() yeterlidir. JSON veya CSV dosyalarını aktarmak için mongoimport ve mongoexport, tam yedek için mongodump araçları daha uygundur.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: MongoDB öğrenme rehberi · Connection string · find sorguları · Authentication etkinleştirme · Node.js nedir