Как получить схему базы данных Мангуста, которая определена в другой модели - PullRequest
50 голосов
/ 04 января 2012

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

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

А вот и мой код в файле album.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);


Как мне знать, что album.js SongSchema , чтобы определить AlbumSchema

Ответы [ 4 ]

86 голосов
/ 04 января 2012

Вы можете получить модели, определенные в других местах, непосредственно с помощью Mongoose:

require('mongoose').model(name_of_model)

Чтобы получить схему в вашем примере в album.js, вы можете сделать это:

var SongSchema = require('mongoose').model('Song').schema
25 голосов
/ 19 октября 2014

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

var SongSchema = require('mongoose').model('Song').schema;
3 голосов
/ 02 января 2013
var SongSchema = require('mongoose').model('Song').schema;

Приведенная выше строка кода в вашем albums.js наверняка будет работать.

2 голосов
/ 05 апреля 2019

Для других, не знакомых с более глубокими аспектами работы Mongoose, существующие ответы могут быть запутанными.

Вот обобщенная реализация пример импорта схемы из другого файла, доступного для более широкой аудитории, исходя из более общего контекста.

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

Вот модифицированная версия для конкретного случая в вопросе (это будет использовано внутри album.js).

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

Исходя из этого, я вижу, что вы сначала обращаетесь к файлу и запрашиваете его, как обычно требуется модель, за исключением того случая, когда вы сейчасспециально обращайтесь к схеме этой модели.

Для других ответов требуется, чтобы mongoose в объявил переменную, что противоречит общеизвестному примеру требования к мангусте перед объявлением переменной, такой как const mongoose = require('mongoose'); изатем с помощью мангуста, как это.Такой вариант использования не был доступен для меня по знаниям.


Альтернативный вариант

Вы можете потребовать только модель , как обычно, и затем обратиться ксхема через свойство схемы модели.

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]
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...