Nested Objects in Mongoose

There is a certain magic in ORMs like Mongoose. I learned it the hard way (as usual!), when I was trying to iterate over nested object’s properties. For example, here is a schema with a nested object features defines like this:

var User = module.exports = new Schema({
  features: { 
    realtime_updates: {
      type: Boolean
    storylock: {
      type: Boolean
    custom_embed_style: {
      type: Boolean
    private_stories: {
      type: Boolean
      type: Boolean

Let’s say I want to overwrite object features_enabled with these properties:

if (this.features) { 
  for (var k in this.features) {
    features_enabled[k] = this.features[k];
return features_enabled;

Not so fast, I was getting a lot of system properties specific to Mongoose. Instead we need to use toObject(), e.g.:

if (this.features.toObject()) { 
  for (var k in this.features.toObject()) {
    features_enabled[k] = this.features.toObject()[k];

Remember rule number one, computer is always right. If we think that it’s wrong — look up the rule number one. :-)

Best Regards,
Azat Mardan
Microsoft MVP | Book and Course Author | Software Engineering Leader
Azat Mardan avatar
To contact Azat, the main author of this blog, submit the contact form or schedule a call at and we can go over your bugs, questions and career.

One thought on “Nested Objects in Mongoose

  1. Neverfox

    Yikes! I was under the assumption that dot notation just works in Mongoose without needing to be aware of what type of field you’re accessing. Any idea why it works this way? Is it by design? It seems like they should build the “magic” in to call toObject on your behalf, since I see no immediate use for the seeming junk it returns otherwise.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.