0
votes

I am a little stuck with trying to figure out the best way to populate a virtual schema in my db. In this instance, I want to check against multiple fields but I do not know any way to do this or alternative ways.

I had hoped I could just use some string arrays in the 'localField' & 'foreignField' keys of the virtual schema but this was not the case.

The user has a 'Series' _id saved, and the virtual schema 'leagues' gets all leagues that the user is entered into too, the catch is a league belongs to different Series. I want to only retrieve the leagues that the user is entered into & that match up with the user's series _id also...

As you can see currently this virtual schema just returns all the leagues the user is entered into regardless of the series. :(

Any ideas? I have been very confused about how to achieve this.

      const schema: mongoose.Schema = new mongoose.Schema({
        _id: {
          type: mongoose.Schema.Types.ObjectId,
          auto: true
        },
        username: {
          type: String,
          unique: true,
        },
        series: {
          ref: 'Serie',
          type: mongoose.Schema.Types.ObjectId,
          autopopulate: {
            maxDepth: 1,
            select: ['title']
          }
        }
      });

      schema.virtual('leagues', {
        ref: 'League',
        localField: '_id',
        foreignField: 'users',
        autopopulate: {
          maxDepth: 1,
          select: ['title', 'engineSize', 'host', 'series']
        }
      });

The league schema looks like this

      const schema: mongoose.Schema = new mongoose.Schema({
        _id: {
          type: mongoose.Schema.Types.ObjectId,
          auto: true
        },
        title: String,
        series: {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Serie',
        },
        users: [{
          type: mongoose.Schema.Types.ObjectId,
          ref: 'User',
        }]
      });
1

1 Answers

0
votes

This was my solution to checking against multiple fields in mongoose using a getter.

 schema.virtual('motoduel').get(function () {
   return motoduelModel.findOne({
     event: this.series.upcomingEvent._id,
     riderGroup: this.riderGroup._id
   });
 });