web-dev-qa-db-fra.com

Comment obtenir le schéma de la base de données mangouste définie dans un autre modèle

Voici ma structure de 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

51
Huy Tran

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 le faire:

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

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

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

Pour d'autres qui ne sont pas aussi familiers avec les aspects plus profonds du fonctionnement de Mongoose, les réponses existantes peuvent prêter à confusion.

Voici un implémentation généralisée exemple d'importation d'un schéma à partir d'un autre fichier accessible à un public plus large provenant d'un contexte plus général .

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

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

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

À partir de cela, je peux voir que vous accédez d'abord et que vous avez besoin du fichier comme vous le feriez normalement pour exiger un modèle, sauf que dans ce cas, vous accédez maintenant spécifiquement au schéma de ce modèle.

D'autres réponses nécessitent la mangouste dans la déclaration de variable et cela va à l'encontre de l'exemple communément demandé d'exiger la mangouste avant de déclarer une variable telle que const mongoose = require('mongoose'); puis en utilisant des mangoustes comme ça. Un tel cas d'utilisation ne m'était pas accessible sur le plan des connaissances.


Option alternative

Vous pouvez exiger uniquement le modèle comme vous le feriez normalement, puis vous référer au schéma via la propriété de schéma 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]
});
3
robertunyx
var SongSchema = require('mongoose').model('Song').schema;

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

3
Amol M Kulkarni