Why the schema is not working?

Hi! I save some data to the database in mongoDB but some key-value pairs are missing in totalExpenses and averange expenses. I don’t know why? The other parts are working.
This is the schema :

export const expenseReportSchema = new mongoose.Schema({
  totalExpenses: [
    { "1": Number },
    { "2": Number },
    { "3": Number },
    { "4": Number },
    { "5": Number },
    { "6": Number },
    { "7": Number },
    { "8": Number },
    { "9": Number },
    { "10": Number },
    { "11": Number },
    { "12": Number },
  ],
  averangeExpenses: [
    { "1": Number, quantity: Number, Mean: Number },
    { "2": Number, quantity: Number, Mean: Number },
    { "3": Number, quantity: Number, Mean: Number },
    { "4": Number, quantity: Number, Mean: Number },
    { "5": Number , quantity: Number, Mean: Number},
    { "6": Number, quantity: Number, Mean: Number },
    { "7": Number, quantity: Number, Mean: Number },
    { "8": Number, quantity: Number, Mean: Number },
    { "9": Number, quantity: Number, Mean: Number },
    { "10": Number, quantity: Number, Mean: Number },
    { "11": Number, quantity: Number, Mean: Number },
    { "12": Number, quantity: Number, Mean: Number },
  ],
  totalSalary:Number,
  averangeSalary:Number,
  typeOfContracts: { permanent: Number , temporary: Number },
  employmentStatus: { student: Number , fullTime: Number , partTime: Number },
  employeeGender: { male: Number , female: Number, other: Number },
});

here is a photo of the db:
Cattura

Hello there,

This looks more like an issue with what is going into the database. That is, the relevant code would be wherever you are populating the database. Can you share more code? Or, better yet, do you have a GitHub repo with this you could share?

Also, just in case it matters: Do you maybe want the property to be averageExpenses, instead of averangeExpenses?

Are you sure there’s something missing? You’ve got 12 items in your schema, and also 12 items in your database (it’s starting at index 0, so the last index is 11).

I believe they are referring to some items not having the Number or Mean values.

Makes sense, I see it now…

The object I am want to send is correctly shown in the console log, but the document I ınserted is missing some key-value pair. Thşs are the logs:

log2

This is the code I use to save

export const createExpenseReport = (report) => new Promise((resolve) =>  {
    const newExpenseReport = new ExpenseReport(report);
        newExpenseReport.save((err, doc) => {
            if (err) throw err;
            console.log("document was inserted %s", doc);
            resolve(doc);
        });
});

this is the connection:
export const ExpenseReport = conn_expenses.model("ExpenseReport", expenseReportSchema);
This is the part where I format the obj to be saved into the database:

 const expenses = await getExpenses();
    // here maniputate MSG and data from db expenses, advancePayments and user controller(from user machine) to create a report then post it to db expense reports
    const addToTotalExpenses = (obj, allExpenses) => {
      if (obj.totalVacations.length > 0) {
        obj.totalVacations.forEach((vacationExpense) => {
          const monthNum = moment(vacationExpense.date[0]).month();
          const storedAmount = allExpenses[monthNum];
          storedAmount[monthNum + 1] =
            parseInt(storedAmount[monthNum + 1]) +
            parseInt(vacationExpense.accommodationFees);
        });
      } else {
        obj.totalExpenses.forEach((otherExpense) => {
          const monthNum = moment(otherExpense.date).month();
          storedAmount[monthNum + 1] =
            parseInt(storedAmount[monthNum + 1]) +
            parseInt(otherExpense.expense);
        });
      }
    };

    const createAnnualExpense = (expenseObj) => {
      // the keys are the months.Ex. january: 0  => 1: 0
      const allExpenses = [
        { 1: 0 },
        { 2: 0 },
        { 3: 0 },
        { 4: 0 },
        { 5: 0 },
        { 6: 0 },
        { 7: 0 },
        { 8: 0 },
        { 9: 0 },
        { 10: 0 },
        { 11: 0 },
        { 12: 0 },
      ];
      expenses.forEach((expense) => {
        addToTotalExpenses(expense, allExpenses);
      });
      // if (expenseObj.category === "vacationExpenses") {
      //   addToTotalExpenses(expenseObj, allExpenses);
      //   return allExpenses;
      // }
      return allExpenses;
    };
    // const totalExpenses = createAnnualExpense(expenseObj);
    const totalExpenses = createAnnualExpense();

    // employee gender
    const employees = await getEmployees();
    const genderDistribution = employees.reduce(
      (genders, person) => {
        genders[person.gender]++;
        return genders;
      },
      { male: 0, female: 0, other: 0 }
    );

    // contract types
    const contractDistribution = employees.reduce(
      (contracts, person) => {
        if(person.contract) contracts[person.contract]++;
        return contracts;
      },
      { permanent: 0, temporary: 0 }
    );
    // employmentStatus
    const employmentStatusDistribution = employees.reduce(
      (employmentType, person) => {
        if(person.employmentType) employmentType[person.employmentType]++;
        return employmentType;
      },
      { student: 0, fullTime: 0, partTime: 0 }
    );
    // averangeExpenses
    const createAverangeExpenses = ()=>{
      const allExpenses = [
        { 1: 0, quantity:0, mean: 0 },
        { 2: 0, quantity:0, mean: 0 },
        { 3: 0, quantity:0, mean: 0 },
        { 4: 0, quantity:0, mean: 0 },
        { 5: 0, quantity:0, mean: 0 },
        { 6: 0, quantity:0, mean: 0 },
        { 7: 0, quantity:0, mean: 0 },
        { 8: 0, quantity:0, mean: 0 },
        { 9: 0, quantity:0, mean: 0 },
        { 10: 0, quantity:0, mean: 0 },
        { 11: 0, quantity:0, mean: 0 },
        { 12: 0, quantity:0, mean: 0 },
      ];

      const addToAverangeExpenses = (obj, allExpenses) => {
        if (obj.totalVacations.length > 0) {
          obj.totalVacations.forEach((vacationExpense) => {
            const monthNum = moment(vacationExpense.date[0]).month();
            const storedMonthInfo = allExpenses[monthNum];
           storedMonthInfo[monthNum + 1] =
              parseInt(allExpenses[monthNum][monthNum + 1]) +
              parseInt(vacationExpense.accommodationFees);
              storedMonthInfo.quantity ++;
              storedMonthInfo.mean = storedMonthInfo[monthNum + 1]/storedMonthInfo.quantity;
          });
        } else {
          obj.totalExpenses.forEach((otherExpense) => {
            const monthNum = moment(otherExpense.date).month();
            const storedMonthInfo = allExpenses[monthNum];
           storedMonthInfo[monthNum + 1] =
              parseInt(allExpenses[monthNum][monthNum + 1]) +
              parseInt(otherExpense.expense);
              storedMonthInfo.quantity ++;
              storedMonthInfo.mean = storedMonthInfo[monthNum + 1]/storedMonthInfo.quantity;
          });
        }
        return allExpenses
      };
  

      expenses.forEach((expense) => {
        addToAverangeExpenses(expense, allExpenses);
      });
return allExpenses;
    }
    const averangeExpenses = createAverangeExpenses();

    // salary info should come from the database, the employeesSalaries array is temporary
    const employeesSalaries =[ {
      person: "Anna Bassi", 
      salary: "1000 EU"
    }, {
      person: "Marco AA", 
      salary: "1000 EU"
    }, {
      person: "Anna  ddd", 
      salary: "200 EU"
    }]
    
    // totalSalary 
    const getTotalSalary = (employeesSalaries=[])=> employeesSalaries.reduce((total, person)=>total += parseInt(person.salary.split(" ")[0]), 0);
    
    // averangeSalary
    const getAverangeSalary = (employeesSalaries=[])=> employeesSalaries.reduce((total, person)=>total += parseInt(person.salary.split(" ")[0])/(employeesSalaries.length-1), 0);
    
    const report = {
      totalExpenses: totalExpenses,
      averangeExpenses,
      employeeGender: genderDistribution,
      typeOfContracts: contractDistribution,
      employmentStatus: employmentStatusDistribution,
      totalSalary: getTotalSalary(employeesSalaries),
      averangeSalary: getAverangeSalary(employeesSalaries)
    };
    console.log("report===>", report)
    createExpenseReport(report)

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.