Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 节点,Mongoose,保存嵌套模式的多个深度时出现问题_Mongodb_Node.js_Nested_Models_Mongoose - Fatal编程技术网

Mongodb 节点,Mongoose,保存嵌套模式的多个深度时出现问题

Mongodb 节点,Mongoose,保存嵌套模式的多个深度时出现问题,mongodb,node.js,nested,models,mongoose,Mongodb,Node.js,Nested,Models,Mongoose,我很难通过Mongoose和node.js在MongoDB中插入多层嵌套模式 下面的例子有点做作,但希望能解释我的问题。至于为什么每个模式都被定义为一个完整的模型,但没有在示例中使用,那只是因为在我的实际问题中,它们是实际的、可用的模型,我希望这个示例在相关的情况下是真实的 下面是按相反顺序排列的模式定义示例,即:首先: //定义笔模型 var PenSchema=新模式({ 颜色:字符串//黑色、蓝色或红色 }); var Pen=mongoose.model('Pen',PenSchema)

我很难通过Mongoose和node.js在MongoDB中插入多层嵌套模式

下面的例子有点做作,但希望能解释我的问题。至于为什么每个模式都被定义为一个完整的模型,但没有在示例中使用,那只是因为在我的实际问题中,它们是实际的、可用的模型,我希望这个示例在相关的情况下是真实的

下面是按相反顺序排列的模式定义示例,即:首先:

//定义笔模型
var PenSchema=新模式({
颜色:字符串//黑色、蓝色或红色
});
var Pen=mongoose.model('Pen',PenSchema);
//定义标尺模型
var RulerSchema=新模式({
单位:字符串//英寸或毫米
});
var-Ruler=mongoose.model('Ruler',RulerSchema);
// --------
//定义绘图工具模型
var drawingtoolschema=新架构({
标签:字符串,
钢笔:[钢笔]
});
var DrawingTools=mongoose.model('DrawingTools',drawingtoolschema);
//定义测量工具模型
var measuringtoolschema=新模式({
标签:字符串,
尺子:[尺子]
});
var MeasuringTools=mongoose.model('MeasuringTools',MeasuringToolsSchema);
// --------
//定义文具盒模型
//它有一个标签和两个隔间-用于绘图和测量的工具
var StationeryBoxSchema=新模式({
标签:字符串,
drawingTools:[DrawingToolsSchema],
测量工具:[测量工具架构]
});
var StationeryBox=mongoose.model('StationeryBox',StationeryBoxSchema);
希望您能从中看出有一个主模型,StationeryBox,它有一个标签,包含两个用于DrawingTools和MeasureingTools的隔间,这两个工具是嵌套模式。它们又有自己的标签,并包含钢笔和尺子的嵌套模式。我遇到的问题是插入第二层嵌套,即钢笔/尺子。因此,基于mongoose文档,创建顶级模型,并推入第一个嵌套对象可以正常工作,然后麻烦就来了。例如:

//创建我的文具盒-此操作有效
var文具=新文具盒({标签:'我的文具盒'});
//若要添加嵌套的隔室,请执行此操作
信纸.绘图工具.推送({标签:'我的笔'});
信纸.测量工具.推送({标签:'我的尺子'});
//但这是错误的,因为“信纸、绘图工具、笔”没有定义
文具.绘图工具.笔.推送({颜色:'红色'});
文具.绘图工具.笔.推送({颜色:'黑色'});
如果我返回一步,尝试在绘图工具的同时插入笔:

//也是错误的-大概是第二层嵌套的问题
文具。绘图工具。推({
标签:“我的笔”,
pens:[//这些对象表示嵌套模式的第二级
{颜色:'红色'},
{颜色:'黑色'}
]
});
我知道这不是一个超现实的例子,但这是一个我正在构建的真实世界系统的简化例子,这是一个最简单的方法来说明这一点

当然,实际的保存发生在这之后,我已经忽略了这一点,但是我是否需要在保存回调中添加这些下一个级别


如果有人能告诉我这件事哪里做错了,或者给我指出了正确的方向,我会给你买一个漂亮的蛋糕(恐怕只有想象中的蛋糕,除非你住得离我很近)。

你非常接近,问题其实出在你的
模式中。这一切都归结为
模式
对象和
模型
对象之间的区别。使用嵌入文档指定mongoose
模式时,只能指向其他模式

var DrawingToolsSchema = new Schema({
  label: String,
  pens: [Pen] // uh-oh, broken! Pen is a Model.
});
var StationeryBoxSchema = new Schema({
  label: String,
  drawingTools: [DrawingToolsSchema], // yes! DrawingToolsSchema is a Schema
  measuringTools: [MeasuringToolsSchema] // this one too.
});
但是,对于在
StationeryBoxSchema
中定义的第一级嵌入式文档,您确实有正确的方法

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

这种差异导致了你以后所有意想不到的行为。

谢谢丹尼尔。当然,你完全正确。我发布最初的问题已经有几天了,在这段时间里我学到了很多东西,所以我真的不记得是否尝试嵌入模型而不是模式只是示例代码中的一个输入错误(在这种情况下,我在其他地方出错了),或者我在“真实世界”代码中犯了同样的错误(从那时起,情况发生了很大变化,所以我无法检查;))。但就像你说的,这可以解释后来的行为,所以你可能是对的!我的荣幸——我知道做这样的事情的几天时间是很长的。节点学习曲线中最陡峭的部分可能是找出如何调试无声失败的问题。