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: '[email protected]', classes: [class1]});
_
_class1
_を保存しても問題ないようですが、mongodbをチェックすると、次のように表示されます:{ "_id" : ObjectId("someId"), "className" : "TEST1234", "grades" : [ 30, 40, 30 ], "marks" : [ 72, 88, 63 ], "__v" : 0 }
_"__v : 0"
_とは何ですか?
ユーザーの保存はまったく成功しません。これは次のエラーです:_ValidationError: CastError: Cast to Array failed for value "{ marks: [ 72, 88, 63 ], grades: [ 30, 40, 30 ], _id: someId, className: 'TEST1234' }" at path "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,
そしてそれは動作します。
タイプと呼ばれるプロパティでタイプルールを明示的に定義することは許可されており、エラーはスローされません。このような:
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が関連するスキーマなしではオブジェクトを解析できないために必要です。これで、内部クラスオブジェクトの新しいスキーマを作成し、メインの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()
_
現在、Mongooseはサブドキュメントをサポートしています。サブドキュメントは、配列をネストする文書化された方法です。
var arraySchema = new Schema({
property: String
});
var objectSchema = new Schema({
arrays: [arraySchema]
});
ソース
デフォルトでは、スキーマにキー 'type'を持つオブジェクトがある場合、mongooseはそれを型宣言として解釈します。
// Mongoose interprets this as 'loc is a String'
var schema = new Schema({ loc: { type: String, coordinates: [Number] } });
TypeKeyの変更:
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