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
},
headerless_embed:{
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];
}
}
console.log(features_enabled)
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()) {
console.log('!',k)
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. :-)
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.