node package manager

mongoose-lean-virtuals

mongoose-lean-virtuals

Attach virtuals to the results of mongoose queries when using .lean()

Usage

const mongooseLeanVirtuals = require('mongoose-lean-virtuals');

examples

It attaches virtuals to result of find, findOne, and findOneAndUpdate if lean

 
    const schema = new mongoose.Schema({
      name: String
    }, { id: false });
 
    schema.virtual('lowercase').get(function() {
      return this.name.toLowerCase();
    });
 
    schema.plugin(mongooseLeanVirtuals);
 
    const Model = mongoose.model('Test', schema);
 
    return Model.create({ name: 'Val' }).
      then(() => Promise.all([
        // You **must** pass `virtuals: true` to `lean()` 
        Model.find().lean({ virtuals: true }),
        Model.findOne().lean({ virtuals: true }),
        Model.findOneAndUpdate({}, { name: 'VAL' }).lean({ virtuals: true })
      ])).
      then(results => {
        const [findRes, findOneRes, findOneAndUpdateRes] = results;
        assert.equal(findRes[0].lowercase, 'val');
        assert.equal(findOneRes.lowercase, 'val');
        assert.equal(findOneAndUpdateRes.lowercase, 'val');
      });
  

It lets you choose which virtuals to apply

If you specify a list of virtuals in lean(), this plugin will only apply those virtuals. This lets you pick which virtuals show up.

 
    const schema = new mongoose.Schema({
      name: String
    }, { id: false });
 
    schema.virtual('lowercase').get(function() {
      return this.name.toLowerCase();
    });
    schema.virtual('uppercase').get(function() {
      return this.name.toUpperCase();
    });
 
    schema.plugin(mongooseLeanVirtuals);
 
    const Model = mongoose.model('Test2', schema);
 
    return Model.create({ name: 'Val' }).
      then(() => Model.findOne().lean({ virtuals: ['uppercase'] })).
      then(result => {
        assert.equal(result.uppercase, 'VAL');
        assert.ok(!result.lowercase);
      });