我正在尝试使用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
}
什么是"__v : 0"
?
保存用户根本不成功,这是以下错误:
ValidationError:CastError:值"{marks:[72,88,63],"的强制转换到数组失败,等级:[30,40,30],_id:someId,className:"TEST1234'}",位于路径"classes"`
这个错误到底意味着什么?为什么它要向数组中投射任何东西?classes: [Class]
不应该是class
类型的数组吗?
伙计,我在创建这样的模式时遇到了类似的问题:
QuestionnaireSchema = mongoose.Schema({
formId: Number,
name: String,
questions: [
{
type: String,
title: String,
alternatives:[{
label: String,
value: "Mixed"
}]
}
]
});
我的错误是我使用"type"作为字段名,而这是猫鼬中的保留词。
我只是更改:
type: String,
至
formType: String,
这是有效的。
请参阅:https://github.com/Automattic/mongoose/issues/1760
允许在名为type的属性上显式定义类型规则,并且不会引发错误。像这样:
type: {type: String}
尝试将类定义更改为:
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在没有相关模式的情况下无法解析对象。现在,当您为内部类对象创建一个新的Schema并在主userSchema中引用它时,mongoose应该能够解析您的对象。
您的模型定义不正确,您应该像下面这样修复。
// 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
})
})
然后,您可以使用populate()
获取提取的数据,如
User
.find()
.populate('classes')
.exec()
默认情况下,如果您的架构中有一个键为"type"的对象,mongoose会将其解释为类型声明。
// Mongoose interprets this as 'loc is a String'
var schema = new Schema({ loc: { type: String, coordinates: [Number] } });
更改类型Key:
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
链接:http://mongoosejs.com/docs/guide.html#typeKey
仅用于更新
现在Mongoose支持子文档,这是嵌套数组的记录方式,
var arraySchema = new Schema({
property: String
});
var objectSchema = new Schema({
arrays: [arraySchema]
});
来源
http://mongoosejs.com/docs/schematypes.html
我使用mongose 5.7.0+使用双嵌套模式时遇到了类似的问题。
只是它与关键字type
无关,而是一个猫鼬验证错误。
https://github.com/Automattic/mongoose/issues/8472
临时解决方法:将Schema.Types.Mixed
用于子模式