> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apinizer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# MongoDb Sık Kullanılan Komutlar

> MongoDB veritabanına bağlanabilir, koleksiyonları sorgulayabilir, güncelleyebilir ve silebilir. Replicaset işlemlerini yönetebilir, yedekleme ve geri yükleme işlemlerini gerçekleştirebilir. API Proxy yeniden oluşturma ve Elasticsearch loglarına erişim sağlayabilir.

<Warning>
  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.
</Warning>

## MongoDb'ye Bağlanma

```bash theme={null}
mongosh mongodb://localhost:25080 --authenticationDatabase "admin" -u "apinizer" -p
```

## Bağlantıktan Sonraki Tüm İşlemler İçin

Doğru veritabanına geçilmeli ve burada çalışılmalıdır:

```bash theme={null}
use apinizerdb
```

## Genel Komutlar

```bash theme={null}
# 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
```

## Arama

```bash theme={null}
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);
        }
    }
});
```

### Bir Variable'ın Hangi Api Proxy'lerdeki Hangi Metotlarda Kullanıldığını Arama

<Note>
  Fonksiyon çalıştırılmadan önce `use apinizerdb` komutu ile doğru database'e geçilmelidir.
</Note>

```javascript theme={null}
#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");
```

## Güncelleme

```bash theme={null}
#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 }
);
```

## Silme

```bash theme={null}
#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()
```

## Replicaset İşlemleri

```bash theme={null}
# replicaset'li sistemde replicayı masterdan sync'e zorlama
rs.syncFrom("hostname:port");
```

## Yedekleme ve Geri Yükleme

<AccordionGroup>
  <Accordion title="Yedek Alma">
    ```bash theme={null}
    sudo mongodump --host <IP_ADDRESS> --port=25080 --username=apinizer --password=<PASSWORD> --authenticationDatabase=admin --gzip --archive=/home/apinizer/apinizer-backup-2023-01-31--1.archive
    ```
  </Accordion>

  <Accordion title="Bazı Boyutu Büyük Tabloları Hariç Tutarak Yedek Alma">
    ```bash theme={null}
    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
    ```
  </Accordion>

  <Accordion title="Yedeği Geri Yükleme">
    ```bash theme={null}
    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
    ```
  </Accordion>

  <Accordion title="Tek Koleksiyonu Yedekleme">
    ```bash theme={null}
    sudo mongodump --host <IP_ADDRESS> --port=25080 --authenticationDatabase "admin" -d apinizerdb -u apinizer -p <PASSWORD> --collection=<COLLECTION_NAME> --out=/home/apinizer/
    ```
  </Accordion>

  <Accordion title="Tek Koleksiyonlu Yedekten Geri Yükleme">
    ```bash theme={null}
    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
    ```
  </Accordion>

  <Accordion title="Toplu Veritabanı Yedeklerinde Gzip ile Sıkıştırılma">
    <Note>
      Toplu veritabanı 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.
    </Note>

    ```bash theme={null}
    gunzip < all-dbs-backup-2023-10-5--02.archive > all-dbs-backup-2023-10-5--02
    ```
  </Accordion>

  <Accordion title="Toplu Veritabanı Yedeği İçerisinden Tek Bir Koleksiyonu Geri Yükleme">
    ```bash theme={null}
    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
    ```
  </Accordion>
</AccordionGroup>

## Loglar

```bash theme={null}
# Uygulama logları
sudo tail -999f /var/log/mongodb/mongod.log
```

## 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.

```bash theme={null}
# 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" } }
)
```
