node.js - Mongoose nested schema array - Object has no method 'id' -



node.js - Mongoose nested schema array - Object has no method 'id' -

i'm trying define folder schema in mongoose. each folder, i'd store reference parent folder, array of kid subfolders (to create traversal in either direction easy):

var folderschema = new mongoose.schema({ name: string, parent: { type: schema.types.objectid, ref: 'folder' }, subfolders: [{ type: schema.types.objectid, ref: 'folder' }], });

when creating folder, want able specify parent folder, , have pre-save hook take care of adding subfolder parent folder's subfolders array. part works fine:

folderschema.pre('save', function (next) { var self = this; // if creating subfolder, add together subfolder // parent folder's "subfolders" array if (this.parent) { folder.findbyid(this.parent, function (err, parent) { if (err) homecoming next(err); if (parent) { parent.subfolders.push(self); homecoming parent.save(next); } homecoming next(); }); } else { next(); } });

also, when deleting subfolder, utilize pre-remove hook automatically remove subfolder parent folder's subfolders array. unfortunately, can't part work:

folderschema.pre('remove', function (next) { var self = this; // if deleting subfolder, remove parent // folder's "subfolders" array // // (note: thought recursively remove // subfolders here, i'm not attempting yet.) if (this.parent) { folder.findbyid(this.parent, function (err, parent) { if (err) homecoming next(err); if (parent) { parent.subfolders.id(self._id).remove(); // typeerror: object 53a64349741d1ae82274c9a2 has no method 'id' homecoming parent.save(next); } homecoming next(); }); } else { next(); } });

the line that's erroring out one:

parent.subfolders.id(self._id).remove();

it results in error:

typeerror: object 53a64349741d1ae82274c9a2 has no method 'id' @ promise.<anonymous> (c:\users\serg\temp\mongoose\folders\index.js:53:35) @ promise.<anonymous> (c:\users\serg\temp\mongoose\folders\node_modules\mongoose\node_modules\mpromise\lib\promise.js:177:8) @ promise.eventemitter.emit (events.js:95:17) @ promise.emit (c:\users\serg\temp\mongoose\folders\node_modules\mongoose\node_modules\mpromise\lib\promise.js:84:38) @ promise.fulfill (c:\users\serg\temp\mongoose\folders\node_modules\mongoose\node_modules\mpromise\lib\promise.js:97:20) @ c:\users\serg\temp\mongoose\folders\node_modules\mongoose\lib\query.js:1393:13 @ model.document.init (c:\users\serg\temp\mongoose\folders\node_modules\mongoose\lib\document.js:250:11) @ completeone (c:\users\serg\temp\mongoose\folders\node_modules\mongoose\lib\query.js:1391:10) @ object.cb (c:\users\serg\temp\mongoose\folders\node_modules\mongoose\lib\query.js:1150:11) @ object._onimmediate (c:\users\serg\temp\mongoose\folders\node_modules\mongoose\node_modules\mquery\lib\utils.js:137:16)

what trying utilize mongoosedocumentarray#id method remove sub document, shown in illustration on sub docs page of mongoose's documentation. however, looks method not available, , i'm not sure why is. did define schema incorrectly? id method not available within middleware? or not using correctly?

the difference here you're using embedded reference object in array, rather direct sub-document. in mongoose illustration of sub-document, shows:

var childschema = new schema({ name: 'string' }); var parentschema = new schema({ children: [childschema] });

so in example, each "child" stored straight within "parent" (so kid lives within parent collection). in scenario, have reference subfolders id rather direct storing of object:

subfolders: [{ type: schema.types.objectid, ref: 'folder' }],

so when perform query, result in subfolders array of ids, 1 of 53a64349741d1ae82274c9a2. has no method id causing problem. however, utilize populate populate objects ids. doing wouldn't give documentarray function need, since mongoose treats these array, rather documentarray (which have id function looking for). you can see logic uses determine how cast these objects here. in end, you'll see when load these objects mongoose casts them array type:

return new types.array(path, cast || types.mixed, obj);

so if want id function can alter schema, or in place. the logic isn't much, might consider searching array 1 matches id manually.

node.js mongoose

Comments

Popular posts from this blog

model view controller - MVC Rails Planning -

ruby on rails - Devise Logout Error in RoR -

html - Submenu setup with jquery and effect 'fold' -