Подтвердить что ты не робот

Как получить схему базы данных мангуста, которая определена в другой модели

Это моя структура папок:

+-- 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

4b9b3361

Ответ 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]
});