58 votes

Comment obtenir le schéma d'une base de données Mongoose définie dans un autre modèle ?

Voici la structure de mes dossiers :

+-- express_example
|---- app.js
|---- models
|-------- songs.js
|-------- albums.js
|---- and another files of expressjs

Mon code dans le fichier songs.js

var mongoose = require('mongoose')
, Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;

var SongSchema = new Schema({
name: {type: String, default: 'songname'}
, link: {type: String, default: './data/train.mp3'}
, date: {type: Date, default: Date.now()}
, position: {type: Number, default: 0}
, weekOnChart: {type: Number, default: 0}
, listend: {type: Number, default: 0}
});

module.exports = mongoose.model('Song', SongSchema);

Et voici mon code dans le fichier albums.js

var mongoose = require('mongoose')
, Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;

var AlbumSchema = new Schema({
name: {type: String, default: 'songname'}
, thumbnail: {type:String, default: './images/U1.jpg'}
, date: {type: Date, default: Date.now()}
, songs: [SongSchema]
});

module.exports = mongoose.model('Album', AlbumSchema);

Comment puis-je faire connaître albums.js SongSchema à définir AlbumSchema

104voto

alessioalex Points 27001

Vous pouvez obtenir des modèles définis ailleurs directement avec Mongoose :

require('mongoose').model(name_of_model)

Pour obtenir le schéma dans votre exemple dans albums.js vous pouvez faire ceci :

var SongSchema = require('mongoose').model('Song').schema

28voto

peteallen Points 183

Pour obtenir le schéma d'un modèle Mongoose enregistré, vous devez accéder spécifiquement au schéma :

var SongSchema = require('mongoose').model('Song').schema;

6voto

robertfoenix Points 463

Pour ceux qui ne sont pas aussi familiers avec les aspects plus profonds du fonctionnement de Mongoose, les réponses existantes peuvent être déroutantes.

Voici un application généralisée exemple d'importation d'un schéma d'un autre dossier accessible à un public plus large venant d'un contexte plus général.

const modelSchema = require('./model.js').model('Model').schema

Voici une version modifiée pour le cas particulier dans la question (cela serait utilisé à l'intérieur de albums.js).

const SongSchema = require('./songs.js').model('Song').schema

À partir de là, je peux voir que vous accédez d'abord au fichier et que vous le demandez comme on le ferait normalement pour demander un modèle, sauf que dans ce cas, vous accédez spécifiquement au schéma de ce modèle.

D'autres réponses nécessitent une mangouste sur la déclaration de la variable et cela va à l'encontre de l'exemple communément trouvé qui consiste à exiger la mangouste avant de déclarer une variable telle que const mongoose = require('mongoose'); et ensuite utiliser la mangouste comme ça. Un tel cas d'utilisation ne m'était pas accessible en termes de connaissances.


Autre option

Vous pouvez exiger juste le modèle comme vous le feriez normalement, puis faites référence au schéma par le biais de la propriété schema du modèle.

const mongoose = require('mongoose');

// bring in Song model
const Song = require('./songs.js');

const AlbumSchema = new Schema({
    // access built in schema property of a model
    songs: [Song.schema]
});

3voto

Amol M Kulkarni Points 4105
var SongSchema = require('mongoose').model('Song').schema;

La ligne de code ci-dessus dans votre albums.js fonctionnera sûrement.

0voto

danH Points 93
"songs" : [{type: Schema.Types.ObjectId, ref: 'Song', required: true}]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X