web-dev-qa-db-fra.com

Mongoose, CastError: Cast to Array a échoué pour la valeur lors de la tentative d'enregistrement d'un modèle qui contient un modèle.

J'essaie de créer le modèle de ma base de données mongodb en utilisant mangouste. Voici ce que j'essaie de faire:

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]});

L'enregistrement de class1 Semble fonctionner correctement, mais lorsque je vérifie mongodb, cela s'affiche: { "_id" : ObjectId("someId"), "className" : "TEST1234", "grades" : [ 30, 40, 30 ], "marks" : [ 72, 88, 63 ], "__v" : 0 }

Qu'est-ce que "__v : 0"?

L'enregistrement de l'utilisateur n'a pas réussi du tout, c'est l'erreur suivante: ValidationError: CastError: Cast to Array failed for value "{ marks: [ 72, 88, 63 ], grades: [ 30, 40, 30 ], _id: someId, className: 'TEST1234' }" at path "classes"

Que signifie exactement l'erreur? Pourquoi jette-t-il quelque chose dans un tableau? classes: [Class] Ne doit-il pas être un tableau de type class?

26
errorreplicating

Mec, j'ai eu un problème similaire en créant un schéma comme celui-ci:

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

Mon erreur est que j'utilise "type" comme nom de champ et c'est le mot réservé dans mangouste.

Je change juste:

            type: String,

à

            formType: String,

et ça marche.

voir: https://github.com/Automattic/mongoose/issues/176

82
Vinicius Lima

La définition explicite de la règle de type sur une propriété appelée type est autorisée et ne générera pas d'erreur. comme ça:

type: {type: String}
12
Aaron Moore

Essayez de changer la définition de classe en:

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);

Cela est nécessaire car la mangouste n'est pas en mesure d'analyser l'objet sans schéma associé. Maintenant, lorsque vous créez un nouveau schéma pour l'objet de classe interne et que vous le référez dans la mangouste userSchema principale, vous devriez pouvoir analyser votre objet.

5
user2709641

La définition de votre modèle est incorrecte, vous devez corriger comme ci-dessous.

// 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 
   })
})

Ensuite, vous pouvez obtenir des données récupérées en utilisant avec populate() comme ceci

User
.find()
.populate('classes')
.exec()
4
Furkan Başaran

Juste pour la mise à jour

Mongoose prend désormais en charge les sous-documents, qui sont le moyen documenté d'imbriquer des tableaux,

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

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

Sources

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

1
J. Pichardo

Par défaut, si vous avez un objet avec la clé 'type' dans votre schéma, mangouste l'interprète comme une déclaration de type.

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

Changer le 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

Lien: http://mongoosejs.com/docs/guide.html#typeKey

0
Sergio Rodrigues