当前位置:  开发笔记 > 编程语言 > 正文

Node,Mongoose,保存多深度嵌套模式的问题

如何解决《Node,Mongoose,保存多深度嵌套模式的问题》经验,为你挑选了1个好方法。

我无法通过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文档,创建顶级模型,并推入第一个嵌套对象工作正常,然后麻烦罢工.例如:

// 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' }
  ]
});

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

实际的保存发生在这之后,我已经把它排除了,但是我是否需要在保存回调中添加这些下一级呢?

如果有人能告诉我我在哪里出错或指向正确的方向我会给你买一个漂亮的蛋糕(想象中的蛋糕只有我害怕,除非你住在我附近).



1> Daniel Mende..:

你非常接近,问题实际上在你的Schema定义中.这一切都归结为Schema对象和Model对象之间的区别.Schema使用嵌入文档指定mongoose 时,只能指向其他 文档Schema.

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

但是,对于定义的第一级嵌入式文档,您确实具有此正确性StationeryBoxSchema.

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

这种差异会在以后解释您的所有意外行为.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有