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

Posted

技术标签:

【中文标题】单独文件上的 Mongoose 子文档,如何嵌入它们【英文标题】:Mongoose Sub-documents on separate files, how to embed them 【发布时间】:2013-12-28 09:16:30 【问题描述】:

我正在定义我的应用程序模型,并且我为我定义的每个模型都有单独的文件,我的问题是,我需要创建一个使用子文档的模型,但那是在另一个文件上,我怎么能在我的模型上使用该架构?我的意思是我见过的所有示例都在同一个文件中声明了子模型和父模型,例如:

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

var parentSchema = new Schema(
  children: [childSchema]
);

我有一个名为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 );

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

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

var sportSchema = new Schema(

  _id       : Schema.Types.ObjectId,
  name      : String

);

module.exports = mongoose.model( 'Sport', sportSchema );

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

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

但我不确定这是否是正确的方法,因为我要导出的是模型,而不是架构。

提前致谢,我想在单独的文件中定义每个模型以保持顺序。

【问题讨论】:

【参考方案1】:

您可以通过其schema 属性访问模型的架构。所以这应该有效:

var userSchema = new Schema(    
  _id           : Schema.Types.ObjectId,
  username      : String,
  sports        : [SportsModel.schema]    
);

【讨论】:

【参考方案2】:

使用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);

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

【讨论】:

它本质上相当于 SQL 中的外键。但 ref 仅适用于内置的 ObjectId 类型。 使用填充可能非常危险。对于 MongoDB 等基于文档的数据库,这几乎是一种反模式。如果您不需要在用户之间共享您的运动,最好使用子文档。基本上,重要的是要记住 MongoDB 不是关系数据库。 @catalyst294 你可能是对的。 . .但你所说的方式听起来像是纯粹的意见。你没有给出任何理由说明它是危险的,也没有给出表明它是反模式的参考资料。 (无论如何,一个简单的谷歌搜索不会出现任何此类参考。)我理解您试图提供帮助,但如果您提供理由和支持,它可能会更多地帮助其他用户。 @tandrewnichols Mongoose 会诱使您认为填充是一个非常快速且易于执行的操作(link 和 link)。但是填充所做的是生成另一个查询。我曾参与过架构设计不佳且这些填充变得非常昂贵的项目。使用文档数据库,您应该更喜欢数据复制,而不是在可能的地方进行这些填充(基本上是连接)。 HTH 人

以上是关于单独文件上的 Mongoose 子文档,如何嵌入它们的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose 在表单中嵌入文档

使用 Mongoose 查询嵌套的嵌入文档

如何使用 Mongoose 返回所有子文档

MongoDB:如何使用 Mongoose 添加或更新子文档?

如何查询和排序 Mongoose 子文档

Mongoose 验证子文档数组