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:
mongosh --versionBir sunucuya bağlanmak

mongosh'u seçeneksiz çalıştırmak, aşağıdaki iki komuttan ikincisiyle aynı şeydir. Port farklıysa adresi yazabilir ya da --port verebilirsiniz:
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:
mongosh "mongodb://db.ornek.com:27017" --username yonetici --authenticationDatabase adminParolayı 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:
mongosh "mongodb://db1.ornek.com:27017,db2.ornek.com:27017,db3.ornek.com:27017/?replicaSet=rs0"
mongosh "mongodb://db1.ornek.com:27017" --tlsBağ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:
db
use magaza
show dbs
show collections
db.urunler.insertOne( { ad: "Kalem", stok: 120 } )
db.urunler.find( { stok: { $gt: 100 } } )| Komut | Ne yapar |
|---|---|
| db | Kullandığı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 databases | Kullanıcının erişebildiği veritabanlarını listeler |
| show collections | Geç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:
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:
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

Tekrarlanan işleri bir .js dosyasına yazabilirsiniz. Örneğin stok-raporu.js:
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:
mongosh --file stok-raporu.js
mongosh --nodb --file stok-raporu.jsload( "stok-raporu.js" )--fileveya-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--fileveya-fkullanmayı önerir.--nodb: mongosh'un hiçbir sunucuya bağlanmadan başlamasını sağlar. Bağlantı bilgisi betiğin içindeconnect()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 kodutryvecatchbloğuna alıpcatchiçindeexitç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:
db = db.getSiblingDB( "magaza" );
printjson( db.urunler.countDocuments( {} ) );mongosh --host db.ornek.com --port 27017 --file sayim.jsKabuğ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:
let komutNo = 1;
prompt = function() {
return "mongosh " + ( komutNo++ ) + "> ";
};config API: kabuk ayarları

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.
config.get( "displayBatchSize" )
config.set( "displayBatchSize", 5 )
config.set( "showStackTraces", true )
config.reset( "displayBatchSize" )| Ayar | Varsayılan | Anlamı |
|---|---|---|
| displayBatchSize | 20 | Her imleç yinelemesinde gösterilen belge sayısı |
| historyLength | 1000 | Geçmiş dosyasında tutulan komut sayısı |
| redactHistory | remove | Hassas komutları geçmişten çıkarma biçimi (keep, remove, remove-redact) |
| showStackTraces | false | Hata mesajıyla birlikte yığın izini gösterme |
| snippetAutoload | true | Kurulu 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;
--filekullanı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
trueveyafalseolabilir. - 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=trueekler; replica set içinreplicaSetparametresini 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