2015-10-18 58 views
1

目前我在看mongoDB。我尝试使用的NodeJS和猫鼬来实现一个简单的一对多关系:MongoDB中的一对多关系

模式/模式用户:

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

var UserSchema = new Schema({ 
    name: String 
}); 

module.exports = mongoose.model('User', UserSchema); 

模型/方案文章:

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

    var ArticleSchema = new Schema({ 
     name: { 
      type: String, 
      required: true 
     }, 
     user: { 
      type: Schema.ObjectId, 
      ref: 'User' 
     } 
    }); 

    module.exports = mongoose.model('Article', ArticleSchema); 

所以我的问题,现在: 我如何获得包括其文章在内的所有用户? 我真的不得不向我的UserScheme添加一个ref吗?像这样的一对多关系中的最佳实践是什么?有没有像MongoDB中的连接?

一个用户有很多文章 - 一篇文章属于一个用户。 调用/ user /:user_id之类的东西,我想接收包含他所有文章的_id = user_id的用户。

回答

1

由于各种原因,这是最可怕的想法。

首先,有一个16MB的BSON文件大小限制。您根本无法将更多内容放入文档中。嵌入文档相当适合“一对多(很少)”的关系,而非“一对多”关系。

至于用例:你在这里有什么问题?它是

对于给定的用户,什么是文章?

REST明智的,你应该只返回物品时/users/:id/articles是GETed和文章(也是唯一的文章)应返回一个JSON阵列。

所以,你的模型看起来很自然。至于用户:

{ 
    _id: theObjectId, 
    username: someString 
    … 
} 

和文章应该是这样的:

{ 
    _id: articleIdOrSlugOrWhatever, 
    authors: [theObjectId], 
    // or author: theObjectId 
    retention: someISODate, 
    published: someOtherISODate 
} 

所以,当你的REST服务要求/users/:id你只需仰望

var user = db.users.findOne({_id:id}) 

而且当调用/users/:id/articles时,您会查找到

var articles = db.articles.find({author:id}) 

问题以可扩展的方式解决,遵循REST原则。