MongoDB中的一对多关系

目前我在看mongoDB。 我尝试使用nodejs和mongoose实现一个简单的一对多关系:

模型/模式用户:

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呢? 什么是这样的一对多关系的最佳做法? 有没有像MongoDB中的join?

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

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

首先,有一个16MB的BSON文件大小限制。 你根本不能把更多的文件。 embedded文档比“一对多”更适合“一对(非常less)”的关系。

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

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

REST明智的,你应该只返回文章/users/:id/articles是GET和文章(只有文章)应返回作为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原则。