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原则。