Mongoose子文件在单独的文件上,如何嵌入它们

kev*_*nco 22 mongoose mongodb node.js express

我正在定义我的应用程序模型,我为每个模型定义了单独的文件,我的问题是,我需要创建一个使用子文档的模型,但是在另一个文件上,我该如何使用该模式在我的模特?我的意思是我见过的所有例子都在同一个文件中声明了Child模型和Parent,例如:

var childSchema = new Schema({ name: 'string' });

var parentSchema = new Schema({
  children: [childSchema]
});
Run Code Online (Sandbox Code Playgroud)

我有一个调用的文件user.js定义了用户模型:

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

var userSchema = new Schema({

  _id           : Schema.Types.ObjectId,
  username      : String,

});


module.exports = mongoose.model( 'User', userSchema );
Run Code Online (Sandbox Code Playgroud)

在另一个名为sport.jsi的文件中,我还有其他运动模型定义:

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

var sportSchema = new Schema({

  _id       : Schema.Types.ObjectId,
  name      : String

});

module.exports = mongoose.model( 'Sport', sportSchema );
Run Code Online (Sandbox Code Playgroud)

所以在我的用户模型中,我需要为用户将遵循的体育定义一个字段,但我不知道如何定义该子文档,因为体育定义在另一个文件上,我试过这个:

var mongoose  = require('mongoose');
var Schema    = mongoose.Schema;
var SportsModel = require('sport');

var userSchema = new Schema({

  _id           : Schema.Types.ObjectId,
  username      : String,
 sports         : [SportsModel]

});


module.exports = mongoose.model( 'User', userSchema );
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否正确,因为我出口的是模型,而不是Schema.

在此先感谢,我想在单独的文件上定义每个模型以维持秩序.

Joh*_*yHK 55

您可以通过其schema属性访问Model的架构.所以这应该工作:

var userSchema = new Schema({    
  _id           : Schema.Types.ObjectId,
  username      : String,
  sports        : [SportsModel.schema]    
});
Run Code Online (Sandbox Code Playgroud)


tan*_*ols 9

使用 ref

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

var userSchema = new Schema({
    _id     : Schema.Types.ObjectId,
    username: String,
    sports  : [{ type: Schema.Types.ObjectId, ref: 'Sport' }]
});

module.exports = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,ref你可以.populate('sports')在查询时使用,而mongoose会为你扩展这些类型.

  • @ catalyst294你可能是对的...但你说的方式听起来像纯粹的意见.你没有说明为什么它是危险的或引用它表明它是反模式的任何理由.(而且对于它的价值,一个简单的谷歌搜索没有出现任何这样的引用.)我知道你正在尝试提供帮助,但如果你提供理由和支持,它可能会帮助其他用户更多. (2认同)
  • @tandrewnichols猫鼬会欺骗您,认为填充是一种非常容易执行的操作([link](http://mongoosejs.com/docs/populate.html)和[link](http://mongoosejs.com/ docs / api.html#query_Query-populate))。但是填充所做的是生成另一个查询。我曾在一些项目中设计过架构,这些模型的设计很差,而且这些模型变得非常昂贵。使用文档数据库时,您应该在可能的地方进行数据填充(基本上是联接),而不要进行数据复制。HTH乡亲 (2认同)