节点,Mongoose,保存多层嵌套模式的问题

我无法解决如何通过Mongoose和node.js在MongoDB中插入多层嵌套模式。

下面的例子是有点人为的,但应该有希望解释我的问题。 至于为什么每个模式被定义为一个完整的模型,但没有在这个例子中使用,这只是因为在我的现实世界的问题,他们是实际的,可用的模型,我想这个例子是现实的,如果它是相关的。

所以这里是相反顺序的示例模式定义,即。 最小的俄罗斯娃娃第一:

// Define pen model var PenSchema = new Schema({ color: String // black, blue or red }); var Pen = mongoose.model('Pen', PenSchema); // Define ruler model var RulerSchema = new Schema({ units: String // inches or millimetres }); var Ruler = mongoose.model('Ruler', RulerSchema); // -------- // Define drawing tools model var DrawingToolsSchema = new Schema({ label: String, pens: [Pen] }); var DrawingTools = mongoose.model('DrawingTools', DrawingToolsSchema); // Define measuring tools model var MeasuringToolsSchema = new Schema({ label: String, ruler: [Ruler] }); var MeasuringTools = mongoose.model('MeasuringTools', MeasuringToolsSchema); // -------- // Define stationery box model // It has a label and two compartments - tools for drawing and measuring var StationeryBoxSchema = new Schema({ label: String, drawingTools: [DrawingToolsSchema], measuringTools: [MeasuringToolsSchema] }); var StationeryBox = mongoose.model('StationeryBox', StationeryBoxSchema); 

希望从这里可以看出,主模型StationeryBox有一个标签,包含两个用于DrawingTools和MeasuringTools的嵌套模式的分隔。 他们又有自己的标签,并包含钢笔和统治者的嵌套架构。 我遇到的问题是插入第二层嵌套,即。 笔/统治者。 所以基于mongoose的文档,创build顶级模型,并推入第一个嵌套的对象工作正常,然后麻烦罢工。 例如:

 // To create my stationery box - this works var stationery = new StationeryBox({ label: 'My Stationery Box' }); // To add the nested compartments - this works stationery.drawingTools.push({ label: 'My Pens' }); stationery.measuringTools.push({ label: 'My Rulers' }); // But this is wrong as 'stationery.drawingTools.pens' is undefined stationery.drawingTools.pens.push({ color: 'red' }); stationery.drawingTools.pens.push({ color: 'black' }); 

如果我回去一步,并尝试与绘图工具同时插入笔:

 // Also wrong - presumably the second level of nesting is the problem stationery.drawingTools.push({ label: 'My Pens', pens: [ // These object represent second levels of nested schema { color: 'red' }, { color: 'black' } ] }); 

我知道这不是一个超现实的例子,但它是我正在构build的一个真实世界系统的简化例子,这是一个最简单的方法来说明这一点。

实际的保存发生在此之后,我已经离开了,但是我需要在保存callback中添加这些下一个级别吗?

如果任何人都可以告诉我哪里错了,或者指向正确的方向,我会给你买一个不错的蛋糕(只有恐惧,除非你住在我附近)。

你非常接近,问题实际上在你的Schema定义中。 这一切都归结于Schema对象和Model对象之间的区别。 在指定embedded文档的mongooseSchema时, 只能指向其他 Schema

 var DrawingToolsSchema = new Schema({ label: String, pens: [Pen] // uh-oh, broken! Pen is a Model. }); 

但是,对于在StationeryBoxSchema定义的第一级embedded式文档,您确实具有此正确性。

 var StationeryBoxSchema = new Schema({ label: String, drawingTools: [DrawingToolsSchema], // yes! DrawingToolsSchema is a Schema measuringTools: [MeasuringToolsSchema] // this one too. }); 

这种差异在以后会占用你所有的意外行为。