Attach virtuals to the results of mongoose lean() queries
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
test
.gitignore
.npmignore
HEADER.md
LICENSE
README.md
index.js
package.json

README.md

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, findById, findByIdAndUpdate, and findOneAndUpdate if lean

const schema = new mongoose.Schema({
  name: String
});

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');

    // Mongoose has an `id` virtual by default that gets the `_id` as a
    // string.
    assert.equal(findRes[0].id, findRes[0]._id.toString());
    assert.equal(findOneRes.id, findOneRes._id.toString());
    assert.equal(findOneAndUpdateRes.id, findOneAndUpdateRes._id.toString());
  });

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);
  });