web-dev-qa-db-ja.com

Mongoose、CastError:モデルを含むモデルを保存しようとしたときに、値の配列へのキャストに失敗しました。

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型の配列であってはなりませんか?

26

男、私はこのようなスキーマを作成する同様の問題がありました:

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/176

82
Vinicius Lima

タイプと呼ばれるプロパティでタイプルールを明示的に定義することは許可されており、エラーはスローされません。このような:

type: {type: String}
12
Aaron Moore

クラス定義を次のように変更してみてください:

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はオブジェクトを解析できるはずです。

5
user2709641

モデル定義が正しくありません。以下のように修正する必要があります。

_// 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()
_
4
Furkan Başaran

更新のみ

現在、Mongooseはサブドキュメントをサポートしています。サブドキュメントは、配列をネストする文書化された方法です。

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

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

ソース

http://mongoosejs.com/docs/schematypes.html

1
J. Pichardo

デフォルトでは、スキーマにキー '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

リンク: http://mongoosejs.com/docs/guide.html#typeKey

0