Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Node.js Mongoose,CastError:尝试保存包含模型的模型时,将值转换为数组失败_Node.js_Mongodb_Mongoose_Nosql - Fatal编程技术网

Node.js Mongoose,CastError:尝试保存包含模型的模型时,将值转换为数组失败

Node.js Mongoose,CastError:尝试保存包含模型的模型时,将值转换为数组失败,node.js,mongodb,mongoose,nosql,Node.js,Mongodb,Mongoose,Nosql,我正在尝试使用mongoose为我的mongodb数据库创建模型。这就是我想做的: var Class = mongoose.model('Class', {className: String, marks: [{type: Number}], grades: [{type: Number}]}); var User = mongoose.model('User', {email: String, classes: [Class] }); //Lets create a new user v

我正在尝试使用mongoose为我的mongodb数据库创建模型。这就是我想做的:

var Class = mongoose.model('Class', {className: String, marks: [{type: Number}], grades: [{type: Number}]});
var User = mongoose.model('User', {email: String, classes: [Class] });


//Lets create a new user
var class1 = new Class({className: 'aaa', marks: [72, 88, 63], grades: [30, 40, 30]});
var user1 = new User({email: 'aaa@some.com', classes: [class1]});
保存
class1
似乎可以正常工作,但当我选中mongodb时,会显示:

{ 
  "_id" : ObjectId("someId"), 
  "className" : "TEST1234", 
  "grades" : [ 30, 40, 30 ], 
  "marks" : [ 72, 88, 63 ], 
  "__v" : 0 
}
什么是
“\uu v:0”

保存用户根本不成功,这是以下错误:

ValidationError:CastError:对值“{marks:[72,88,63], 职系:[30,40,30], _id:someId, 路径“classes”处的className:'TEST1234'} `


这个错误到底意味着什么?为什么它要将任何东西投射到数组中?
classes:[Class]
不应该是一个类型为
Class
的数组吗?

您的模型定义不正确,您应该按照以下方式进行修复

// var Schema = mongoose.Schema;
var User = mongoose.model('User',{ 
  email: String, 
  classes: [ {type: Schema.Types.ObjectID, ref: 'Class'}] 
});

var Class1 = new Class({/*yourDataWillBeHere*/})

Class1.save(function(err, classData) {
   var User1 = new User({/*YourDataWillBeHere*/})
   User1.classes.push(classData._id);
   User1.save(function(err, userData) {
      //make something with userData object 
   })
})
然后您可以像这样使用with
populate()
获取数据

User
.find()
.populate('classes')
.exec()

尝试将类定义更改为:

var classSchema = mongoose.Schema({className: String, marks: [{type: Number}], grades: [{type: Number}]});
var userSchema = mongoose.Schema({email: String, classes: [classSchema] });
var User = mongoose.model('User',userSchema);

这是必需的,因为mongoose无法在没有相关模式的情况下解析对象。现在,当您为内部类对象创建新模式并在主用户模式中引用它时,mongoose应该能够解析您的对象

伙计,我在创建这样的模式时遇到了类似的问题:

QuestionnaireSchema = mongoose.Schema({
    formId: Number,
    name: String,
    questions: [
        {
            type: String,
            title: String,
            alternatives:[{
                label: String,
                value: "Mixed"
            }]
        }
    ]
});
type: {type: String}
我的错误是我使用“type”作为字段名,而这是mongoose中的保留字

我只是改变一下:

type: String,

这就行了


请参阅:

默认情况下,如果模式中有键为“type”的对象,mongoose会将其解释为类型声明

// Mongoose interprets this as 'loc is a String'
var schema = new Schema({ loc: { type: String, coordinates: [Number] } });
更改类型键:

var schema = new Schema({
  // Mongoose interpets this as 'loc is an object with 2 keys, type and coordinates'
  loc: { type: String, coordinates: [Number] },
  // Mongoose interprets this as 'name is a String'
  name: { $type: String }
}, { typeKey: '$type' }); // A '$type' key means this object is a type declaration
链接:

仅用于更新 现在Mongoose支持子文档,这是嵌套数组的文档化方法

var arraySchema = new Schema({
    property: String
});

var objectSchema = new Schema({
    arrays: [arraySchema]
});
来源


允许在名为type的属性上显式定义类型规则,并且不会引发错误。像这样:

QuestionnaireSchema = mongoose.Schema({
    formId: Number,
    name: String,
    questions: [
        {
            type: String,
            title: String,
            alternatives:[{
                label: String,
                value: "Mixed"
            }]
        }
    ]
});
type: {type: String}

我在使用Mongoose5.7.0+和双嵌套模式时遇到了类似的问题

除了它与关键字
type
无关,而是一个猫鼬验证错误


临时解决方法:对子模式使用
Schema.Types.Mixed

我似乎无法让它正常工作。
TypeError:Schema路径“type”的值无效,
var User=…,
我缺少什么?我取消了模式行的注释,也定义了上面的类。你知道,我感觉你帮我省了好几个小时的时间。谢谢先生,你应该得到一个为我工作的厨师!!谢谢:)或者,如果您想保留问题对象键“type”,您可以使用下面的Andrew Moores答案。这是我的首选解决方案,而不是将我的键从“type”更改为“type”。