1

In my collection on my app, I have a schema of individuals. For each person, I need to find the average of a field (comparatio) for everyone else with the same characteristic, and assign that to a variable in the person's document.

My schema looks like:

    const employeeSchema = new mongoose.Schema({
      // .... condensed schema for purposes of this question
      comparatio: {type: Number},
      comparatioPeer: {type: Number},
      hourlyRate: {type: Number},
      genderPayGap: {type: Number},
      peerID: {type: String},
    });

Currently I have an async function that looks like:

const allEmployees = await db.Employee.find({})

        genderPayPeers = await db.Employee.aggregate([
          {$group: {
            _id: {
              id: '$peerID',
              gender: '$gender',
            },
            avgHourlyRate: {$avg: '$hourlyRate'}
          }}
        ]);

        comparatioPeers = await db.Employee.aggregate([
          {$group: {
            _id: '$peerID',
            avgComparatio: {$avg: '$comparatio'}
          }}
        ])

        allEmployees.map(employee => {
          if (employee.gender == 'M') {
            const lookupObject = {
              id: employee.peerID,
              gender: 'F',
            }
            let genderPeer = genderPayPeers.find(x => x._id == lookupObject);

          } else {
            const lookupObject = {
              id: employee.peerID,
              gender: 'M',
            }
            let genderPeer = genderPayPeers.find(x => x._id == lookupObject);
          }

          let comparatioPeer = comparatioPeers.find(x => x._id == employee.peerID);
          console.log(genderPeer);
          console.log(comparatioPeer);

          employee.genderPayGap = (employee.hourlyRate - genderPeer.avgHourlyRate)/genderPeer.avgHourlyRate;
          employee.comparatioPeer = comparatioPeer.avgComparatio;
          employee.save();

When I run the above, I am getting an error:

ReferenceError: genderPeer is not defined

I feel like I am missing something very obvious.

Neil Lunn
  • 148,042
  • 36
  • 346
  • 317
KevinD
  • 139
  • 2
  • 14

1 Answers1

1

A variable defined by let keyword is visible only inside of block scope which means a scope defined by curly brackets. In your code you're defining genderPeer twice but in both cases it's visible only inside of that small block of code:

if (employee.gender == 'M') {
    const lookupObject = {
        id: employee.peerID,
        gender: 'F',
    }
    let genderPeer = genderPayPeers.find(x => x._id == lookupObject);

} else {
    const lookupObject = {
        id: employee.peerID,
        gender: 'M',
    }
    let genderPeer = genderPayPeers.find(x => x._id == lookupObject);
}

To fix that you should move the variable definition outside of those scopes like:

let genderPeer;

if (employee.gender == 'M') {
    const lookupObject = {
        id: employee.peerID,
        gender: 'F',
    }
    genderPeer = genderPayPeers.find(x => x._id == lookupObject);

} else {
    const lookupObject = {
        id: employee.peerID,
        gender: 'M',
    }
    genderPeer = genderPayPeers.find(x => x._id == lookupObject);
}
mickl
  • 48,568
  • 9
  • 60
  • 89