Mongoose Virtuals in MongoDB Aggregate

This is an old question but I've come up with a useful hack to get back the virtuals and thought it might be useful for those searching for this problem.

You can easily convert the objects back to mongoose models:

documents = documents.map(d => {
  return new Document(d);
});

var virtual = documents[0].virtualProperty;

A couple notes in the docs touch on why this is so:

  • Arguments are not cast to the model's schema because $project operators allow redefining the "shape" of the documents at any stage of the pipeline, which may leave documents in an incompatible format.
  • The documents returned are plain javascript objects, not mongoose documents (since any shape of document can be returned).

But it goes beyond this because the aggregate operation is performed server-side, where any client-side Mongoose concepts like virtuals do not exist.

The result is that you'll need to include the date field in your $project and $group stages and add your own dateformatted field to the results in code based on the date values.