Mongoose Instance Methods () , create methods inside and outside Schema
Tags: javascript, webdev, database, programming
Published: 2024-02-08 15:54:54

## How to create an instance method inside and outside of schema 
## Here is a large size and complex program to enhance your skill on SchemaModel and instance method ..
## follow my github account to get this code on my github profile
[click to get into this code ](https://github.com/swapnanilWebDeveloper/MongooseJs_Programs/blob/main/SchemaModel_1/src/instanceMethods_1.js)

```javascript

const mongoose = require('mongoose');

main().catch(err => console.log(err));

async function main() {

    await mongoose.connect('mongodb://127.0.0.1:27017/AnimalData');

    const animalSchema = new mongoose.Schema({ 
                             name: String,
                             type: String,
                             priceUSD : Number,
                             discPerc : Number,
                             discAvailable : Boolean,
                             countryOrigin : String,
                             breedQuality : String,
                             medicalExp : Number,
                            },
        {
            methods: {

                async findByName(modelName){
                   console.log("findByName method executed successfully....");
                   const name_result = await modelName.find({ name : this.name});

                   console.log("name = "+this.name+", type = "+this.type+
                   ",\nprice $"+this.priceUSD+" USD ,discount percentage = "+this.discPerc+", discount available = "+this.discAvailable+
                   "\n, country of origin = "+this.countryOrigin+
                   ",\nbreed quality = "+this.breedQuality+", medical expenses anually = $"+this.medicalExp+"USD\n")
                },
                  
                async findSimilarTypes(modelName) {
                    console.log("findSimilarTypes function() has been executed successfully.....");
                    
                    console.log("all the animals of type : "+this.type+" is \n");
                    return await modelName.find({ type: this.type }, "name type countryOrigin breedQuality");
                },

                async findSimilarCountryOrigins(modelName) {
                    console.log("findSimilarCountryOrigin function() has been executed successfully.....");
                    
                    console.log("all the animals originated from : "+this.countryOrigin+" is \n");
                    return await modelName.find({ countryOrigin: this.countryOrigin }, "name countryOrigin priceUSD medicalExp");
                },

                async findSimilarBreedQualities(modelName) {
                    console.log("findSimilarBreedQuality function() has been executed successfully.....");
                    
                    console.log("all the animals of breed quality : "+this.breedQuality+" is \n");
                    return await modelName.find({ breedQuality: this.breedQuality  }, "name type breedQuality countryOrigin");
                }

            }
        });

        animalSchema.methods.findPrice = async function() {
             console.log("\nI am inside findPrice method....");

             console.log("name = "+this.name+", type = "+this.type+
                   ",\nprice $"+this.priceUSD+" USD ,discount percentage = "+this.discPerc+", discount available = "+this.discAvailable+
                   "\n, country of origin = "+this.countryOrigin+
                   ",\nbreed quality = "+this.breedQuality+", medical expenses anually = "+this.medicalExp);
           
                   if(this.discAvailable){
                    const netPrice = this.priceUSD - this.priceUSD * ( this.discPerc / 100); 
                    return "price after discount = $"+netPrice+"\n";
                   }
                   else{
                     return "Discount is not available for "+this.name+" ("+this.type+")";
                   }
          };

    const Animal = mongoose.model('Animal', animalSchema);

    await Animal.insertMany([
        { 
            name : "German Shepard",
            type: 'Dog' ,
            priceUSD : 2500,
            discPerc : 22,
            discAvailable : true,
            countryOrigin : "Germany",
            breedQuality : "High",
            medicalExp : 490, 
        },
        {
            name : "Husky",
            type : "Dog",
            priceUSD : 1865,
            discPerc : 16,
            discAvailable : true,
            countryOrigin : "Alaska",
            breedQuality : "Medium",
            medicalExp : 255, 
        },
        {
            name : "British Short Hair",
            type : "Cat",
            priceUSD : 1250,
            discPerc : 34,
            discAvailable : false,
            countryOrigin : "United Kingdom",
            breedQuality : "Medium",
            medicalExp : 345, 
        },
        {
            name : "American Fluffy",
            type : "Cat",
            priceUSD : 1750,
            discPerc : 28,
            discAvailable : true,
            countryOrigin : "United Kingdom",
            breedQuality : "Low",
            medicalExp : 259, 
        },
        {
            name : "Bittle Sumdohg",
            type : "Rat",
            priceUSD : 2445,
            discPerc : 11,
            discAvailable : false,
            countryOrigin : "Alaska",
            breedQuality : "High",
            medicalExp : 735, 
        },
        {
            name : "Rattle Snake",
            type : "Snake",
            priceUSD : 3775,
            discPerc : 25,
            discAvailable : true,
            countryOrigin : "Germany",
            breedQuality : "Low",
            medicalExp : 1325, 
        },
        {
            name : "Black Mamba",
            type : "Snake",
            priceUSD : 1985,
            discPerc : 39,
            discAvailable : false,
            countryOrigin : "Uited States of America",
            breedQuality : "Medium",
            medicalExp : 688, 
        },
    ]);

    const allAnimals = await Animal.find({});
    // console.log(allAnimals);

    const name_results = await allAnimals[2].findByName(Animal);

    const type_results = await allAnimals[5].findSimilarTypes(Animal);
    console.log(type_results);

    const countryOrigin_results = await allAnimals[1].findSimilarCountryOrigins(Animal);
    console.log(countryOrigin_results);

    const breed_results = await allAnimals[3].findSimilarBreedQualities(Animal);
    console.log(breed_results);

    const price_result1 = await allAnimals[4].findPrice() 
    console.log(price_result1);

    const price_result2 = await allAnimals[3].findPrice() ;
    console.log(price_result2);
}

// {name : "Bittle Sumdohg", countryOrigin : "Alaska"}

```

In the above code we have created findByName(),findSimilarTypes(),
findSimilarCountryOrigins(), findSimilarBreedQualities() these 4 instance methods inside schema and there is another instance method which we have created outside schema and that is : findPrice().

Now Let's checkout the following output : 

```
PS C:\Users\USER\Downloads\mongoExpress\SchemaModel_1> node src/instanceMethods_1.js
findByName method executed successfully....
name = British Short Hair, type = Cat,
price $1250 USD ,discount percentage = 34, discount available = false
, country of origin = United Kingdom,
breed quality = Medium, medical expenses anually = $345USD

findSimilarTypes function() has been executed successfully.....
all the animals of type : Snake is 

[
  {
    _id: new ObjectId('65c4f4509bdd71e1a0363340'),
    name: 'Rattle Snake',
    type: 'Snake',
    countryOrigin: 'Germany',
    breedQuality: 'Low'
  },
  {
    _id: new ObjectId('65c4f4509bdd71e1a0363341'),
    name: 'Black Mamba',
    type: 'Snake',
    countryOrigin: 'Uited States of America',
    breedQuality: 'Medium'
  }
]
findSimilarCountryOrigin function() has been executed successfully.....
all the animals originated from : Alaska is

[
  {
    _id: new ObjectId('65c4f4509bdd71e1a036333c'),
    name: 'Husky',
    priceUSD: 1865,
    countryOrigin: 'Alaska',
    medicalExp: 255
  },
  {
    _id: new ObjectId('65c4f4509bdd71e1a036333f'),
    name: 'Bittle Sumdohg',
    priceUSD: 2445,
    countryOrigin: 'Alaska',
    medicalExp: 735
  }
]
findSimilarBreedQuality function() has been executed successfully.....
all the animals of breed quality : Low is

[
  {
    _id: new ObjectId('65c4f4509bdd71e1a036333e'),
    name: 'American Fluffy',
    type: 'Cat',
    countryOrigin: 'United Kingdom',
    breedQuality: 'Low'
  },
  {
    _id: new ObjectId('65c4f4509bdd71e1a0363340'),
    name: 'Rattle Snake',
    type: 'Snake',
    countryOrigin: 'Germany',
    breedQuality: 'Low'
  }
]

I am inside findPrice method....
name = Bittle Sumdohg, type = Rat,
price $2445 USD ,discount percentage = 11, discount available = false
, country of origin = Alaska,
breed quality = High, medical expenses anually = 735
Discount is not available for Bittle Sumdohg (Rat)

I am inside findPrice method....
name = American Fluffy, type = Cat,
price $1750 USD ,discount percentage = 28, discount available = true
, country of origin = United Kingdom,
breed quality = Low, medical expenses anually = 259
price after discount = $1260

``` 

![MongoDBCompass ouput1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ee2xtm8vpa7xkuio4np.png)
![MongoDBCompass ouput2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4hdyg7ktu06q1gue2s7i.png)

![MongoDBCompass ouput3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zzu0b5thiopoqlujlpsi.png)