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
?
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.
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}
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.
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()
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
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