Как получить схему базы данных мангуста, которая определена в другой модели
Это моя структура папок:
+-- express_example
|---- app.js
|---- models
|-------- songs.js
|-------- albums.js
|---- and another files of expressjs
Мой код в файле 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);
И вот мой код в файле 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);
Как я могу сделать albums.js знать SongSchema для определения AlbumSchema
Ответы
Ответ 1
Вы можете получить модели, определенные в другом месте непосредственно с помощью Mongoose:
require('mongoose').model(name_of_model)
Чтобы получить схему в вашем примере в альбоме, вы можете сделать это:
var SongSchema = require('mongoose').model('Song').schema
Ответ 2
Чтобы получить схему из зарегистрированной модели Mongoose, вам необходимо получить доступ к схеме конкретно:
var SongSchema = require('mongoose').model('Song').schema;
Ответ 3
var SongSchema = require('mongoose').model('Song').schema;
Вышеуказанная строка кода в вашем albums.js
, безусловно, будет работать.
Ответ 4
Для других, не знакомых с более глубокими аспектами работы Mongoose, существующие ответы могут ввести в заблуждение.
Вот обобщенный пример реализации импорта схемы из другого файла, который доступен для более широкой аудитории, исходя из более общего контекста.
const modelSchema = require('./model.js').model('Model').schema
Или модифицированный для случая в вопросе (это будет использоваться внутри album.js).
const SongSchema = require('./songs.js').model('Song').schema
Из этого я вижу, что вы сначала обращаетесь к файлу и запрашиваете его, как обычно требуется для модели, за исключением того, что в этом случае вы теперь конкретно обращаетесь к схеме этой модели.
Другие ответы требуют наличия mongoose в объявлении переменной, что противоречит общепринятому примеру требования mongoose перед объявлением переменной, такой как const mongoose = require('mongoose');
а затем с помощью мангуста, как это. Такой вариант использования не был доступен для меня по знаниям.
Альтернативный вариант
Вы можете запросить только модель, как обычно, а затем обратиться к схеме через свойство схемы Model.
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]
});