Production ortamlarında veriye doğrudan müdahale edilmesi hiçbir zaman önerilmemektedir.
Production ortamlarında yapılacak her türlü işlem veya değişiklik öncesinde, ilgili adımların mutlaka test ortamında denenmesi ve sistemin güncel yedeğinin alınması gerekmektedir.

MongoDb'ye bağlanma

mongosh mongodb://localhost:25080 --authenticationDatabase "admin" -u "apinizer" -p 
POWERSHELL

Bağlantıktan sonraki tüm işlemler için, doğru veritabanına geçilmeli ve burada çalışılmalıdır

use apinizerdb
POWERSHELL

Genel komutlar

#Replicaset detaylarını gösterme
rs.status()

#Kullanıcıları gösterme
db.getUsers()

#Mevcut veritabanındaki koleksiyonların isim ve bilgilerini gösterme
db.getCollectionNames()
db.getCollectionInfos()

#Herhangi bir koleksiyonun boyutunu MB olarak görme
db.audit_event.stats().storageSize/1024/1024
POWERSHELL

Arama

db.user.find( { login: "admin" } );

db.db_to_api.find().pretty().limit(10)

#Api Proxy'de full text search 
db.api_proxy.ensureIndex(
    { "$**": "text" },
    { name: "TextIndex" }
);

#Belirli koleksiyonda bir metin araması yapar.
db.api_proxy.find(
	{
	  $text: {
	    $search: "XMLRESULTwithNS"
	  }
	},{
		"name":1
	}
)

 #Kriter ile arama yapma
db.api_proxy.find( {importedUrl: /.*kps.*/ })

#Çoklu kriter ile arama yapma
db.getCollection('api_proxy').find({$and: [{'routing.kpsSettings': { $exists: true }},{importedUrl: /.*kps.*/ }]})

#Regex kullanımı
db.api_proxy.find({ "apiMethodList": { "$elemMatch": { "requestPolicyList": { "$elemMatch": { "name": { "$regex" : /^PolicyJwt3rdAuthentication/i } } } } } });
db.api_proxy.find({ "requestPolicyList": { "$elemMatch": { "name": { "$regex" : /^PolicyJwt3rdAuthentication/i } } } });
db.api_proxy.find({ "requestPolicyList": { "$elemMatch": { "_class": { "$regex" : /.*jwt.*/i } } } } , {"name":1,"requestPolicyList.name":1,"requestPolicyList._class":1});

#Tüm alanlarda arama yapılması
db.api_proxy.find({ $where: function() {
  for (var key in this) {
    if (JSON.stringify(this[key]).indexOf("172.16.1.1") !== -1) {
      return true;
    }
  }
  return false;
}}, {_id: 0,name:1,projectId:1})


#Son 2 saate kadar olan logların sayısını getirir
mongosh mongodb://localhost:25080/apinizerdb --authenticationDatabase "admin" -u "apinizer" -p "password" --eval 'db.apinizer_log.find({"date":{"$lte": new Date((new Date().getTime() - (2 * 60 * 60 * 1000)))}}).count()'

#Tüm koleksiyonlardaki tüm alanlarda <SEARCH_TERM> ifadesini arar
db.getCollectionNames().forEach(function(collName) {
    var cursor = db[collName].find();
    while (cursor.hasNext()) {
        var doc = cursor.next();
        if (JSON.stringify(doc).includes("<SEARCH_TERM>")) {
            print("Found in " + collName);
            printjson(doc);
        }
    }
});

POWERSHELL

Bir Variable'ın hangi Api Proxy'lerdeki hangi Metotlarda kullanıldığını arama

#Fonksiyon çalıştırılmadan önce "use apinizerdb" komutu ile doğru database'e geçilmelidir.

function getApiMethodListObjectsWithFilledRequestPolicyList(nameToCheck) {
    let skipCount = 0;
    const limitCount = 1000;
    console.log("Çıktı formatı: Proxy Adı;Metod Adı;Request/Response Hattı;Politika cinsi.")
    console.log("")
    while (true) {
        const cursor = db.api_proxy.find(
            { "apiMethodList": { $exists: true, $ne: [] } }
        ).skip(skipCount).limit(limitCount);

        if (!cursor.hasNext()) {
            break;
        }
        cursor.forEach(doc => {
            doc.apiMethodList.forEach(object => {
                if (object.requestPolicyList && object.requestPolicyList.length > 0) {
                    object.requestPolicyList.forEach(policy => {
                     if (JSON.stringify(policy).includes(nameToCheck)) {
                            console.log(doc.name + ";" + object.name + ";Request;" + policy._class)
                    }
                    });
                }
                if (object.responsePolicyList && object.responsePolicyList.length > 0) {
                    object.responsePolicyList.forEach(policy => {
                        if (JSON.stringify(policy).includes(nameToCheck)) {
                           console.log(doc.name + ";" + object.name + ";Response;" + policy._class)
                        }
                    });
                }
            });
            if (doc.requestPolicyList && doc.requestPolicyList.length > 0) {
                doc.requestPolicyList.forEach(policy => {
                    if (JSON.stringify(policy).includes(nameToCheck)) {
                        console.log(doc.name + ";ALL;Request;" + policy._class)
                    }
                });
            }
            if (doc.responsePolicyList && doc.responsePolicyList.length > 0) {
                doc.responsePolicyList.forEach(policy => {
                    if (JSON.stringify(policy).includes(nameToCheck)) {
                        console.log(doc.name + ";ALL;Response;" + policy._class)
                    }
                });
            }
        });
        skipCount += limitCount;
    }
  console.log("")
}

getApiMethodListObjectsWithFilledRequestPolicyList("KEYWORDTOSEARCH");
JS

Güncelleme

#Alt elemanın güncellenmesi
db.api_proxy.update( {name :"KYS Yabanci AdSoyad Getir GW"}, {$set: {"routing.connectTimeout": "30"}} );

#Soap-2-Rest cinsindeki bir proxy'deki tüm "unwrapelement" objelerinin değerini true'a çevirme (1 kayıt içinde birden fazla array'de düzenleme yapılırsa sonuç 1 olarak döner)
db.api_proxy.updateMany({relativePath:"/tarServis"},{$set:{"apiMethodList.$[].protocolTransformation.unwrapElement":true}});

#Alt elemana obje eklenmesi (objedeki array'in ikinci objesine ilgili alanı ekler )
db.api_proxy.update( {"relativePath":"/ydsSorgulamaServisi"}, {$push: {"requestPolicyList.1.unPasswordDecrypted": "false"}} );


#admin kullanıcısının şifresini "admin" yapma
db.user.update({"login" : "admin"},{$set: { "password" : "$2a$10$Wv6i9IIdNzlxgDdaf13UdOl7uumVcG7zkSEKaOG4Xqn6IlLuwA13e"}});

#admin kullanıcısının kilitlenmesi sonrası kilidi kaldırma
db.user.updateOne({ _id: "admin" },{ $set: { locked: false } })


#Bir tabloyu kontrol etme ve bir kritere uyan kayıtların değeri değiştirme
db.getCollection('patch_history').find({})
db.patch_history.update({"status" : "RUNNING"},{$set: { "status" : "COMPLETED"}});

db.api_proxy.update( {},
    { 
        "$pull": { 
            "apiProxyDeployList": { 
                "environmentSettingsId": "60e2ad54d5ba7a7636db3aa6" 
            }
        } 
    }, { "multi": true }
);


db.api_proxy.update( {_id : ObjectId("611628a3c21a5c04977e98e2")},
    { 
        "$pull": { 
            "apiProxyDeployList": { 
                "environmentSettingsId": "60e2ad54d5ba7a7636db3aa6" 
            }
        } 
    }, { "multi": true }
);  
POWERSHELL

Silme

#Obje silme (where koşuluna uygun her şeyi siler)
db.privacy_settings.remove({ "salt":"UCPyFvw0EAnOgfOJ"  })

#api_proxy altındaki apiProxyDeployList'i temizleme
//ilk satırdaki where koşulu, tüm doküman üzerinde güncelleme yapılmak istendiği için boş
//ikinci satırdaki where koşulu, apiProxyDeployList'in altındaki her şey silineceği için boş
db.api_proxy.update(
  {  },
  {$pull : {"apiProxyDeployList" : {} }}
)

#Koleksiyondaki tüm kayıtları silme (truncate)
db.db_to_api.remove({})

#Koleksiyonu drop etme
db.db_to_api.drop()

#Koleksiyonu mongoya girmeden drop etme
mongo "mongodb://<IP_ADDRESS>:25080/apinizerdb" --eval 'db.getSiblingDB("admin").auth("apinizer", "PASSWORD"); db.getSiblingDB("apinizerdb").apinizer_log.drop();'

#Veritabanını drop etme
db.dropDatabase()
POWERSHELL

Replicaset İşlemleri

#replicaset'li sistemde replicayı masterdan sync'e zorlama
rs.syncFrom("hostname:port");
POWERSHELL

Yedekleme ve Geri Yükleme

#Yedek alma
sudo mongodump --host <IP_ADDRESS> --port=25080 --username=apinizer --password=<PASSWORD> --authenticationDatabase=admin --gzip --archive=/home/apinizer/apinizer-backup-2023-01-31--1.archive

#Bazı boyutu büyük tabloları hariç tutarak yedek alma
sudo mongodump --host <IP_ADDRESS> --port 25080 --excludeCollection apinizer_log --excludeCollection audit_event -d apinizerdb --authenticationDatabase "admin" -u apinizer -p <PASSWORD> --gzip --archive=/home/apinizer/apinizer-backup-2023-01-31--1.archive

#Yedeği geri yükleme
sudo mongorestore --drop --host <IP_ADDRESS> --port 25080 -u apinizer -p <PASSWORD> --authenticationDatabase=admin --gzip --archive=/home/apinizer/apinizer-backup-2023-01-31--1.archive

#Tek koleksiyonu yedekleme
sudo mongodump --host <IP_ADDRESS> --port=25080 --authenticationDatabase "admin" -d apinizerdb -u apinizer -p <PASSWORD> --collection=<COLLECTION_NAME> --out=/home/apinizer/

#Tek koleksiyonlu yedekten geri yükleme
sudo mongorestore --drop --host <IP_ADDRESS> --port=25080 --authenticationDatabase "admin" -d apinizerdb -u apinizer -p <PASSWORD> --collection=<COLLECTION_NAME> /home/apinizer/apinizerdb/<COLLECTION_NAME>.bson

#Toplu veritabani yedeklerinde gzip ile sıkıştırılma yapılabiliyor, bu durumda aşağıdaki komutu kullanarak düzgün bir archive haline getirip yukarıdaki komutu tekrar çalıştırabilirsiniz.
gunzip < all-dbs-backup-2023-10-5--02.archive > all-dbs-backup-2023-10-5--02

#Toplu veritabani yedeği içerisinden tek bir koleksiyonu geri yükleme
mongorestore --host <IP_ADDRESS> --port 25080 --username apinizer --password  <PASSWORD> --authenticationDatabase admin --drop --nsInclude 'apinizer-dev.environment_settings' --archive=all-dbs-backup-2023-10-5--02
POWERSHELL

Loglar

#Uygulama logları
sudo tail -999f /var/log/mongodb/mongod.log
POWERSHELL

Apinizer'da API Proxy Yeniden Oluşturma ve Elasticsearch Loglarına Ulaşma

Bu komutlar, bir API Proxy silindiğinde ve yeniden oluşturulduğunda ya da export/import işlemleri yapıldığında Elasticsearch loglarına aynı API Proxy üzerinden erişimi sağlamak için kullanılır.

# Proxy belgesini bir değişkende sakla
doc = db.api_proxy.findOne({_id: ObjectId("YANLISPROXYID")})

# Yeni bir _id ayarla
doc._id = ObjectId("OLMASIGEREKENPROXYID")

# Yeni _id ile belgeyi ekle
db.api_proxy.insert(doc)

# Eski _id ile olan belgeyi sil
db.api_proxy.remove({_id: ObjectId("YANLISPROXYID")})

# Apinizer için gerekli güncelleme
db.api_proxy_revision.update({apiProxyId:"YANLISPROXYID"}, {$set: { apiProxyId:"OLMASIGEREKENPROXYID"}})

# Yetkilerin güncellenmesi
db.credential_allowed_api_proxy.updateMany({apiProxyId:"YANLISPROXYID"}, {$set: { apiProxyId:"OLMASIGEREKENPROXYID"}})
POWERSHELL