目前,我正在查看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 /:user_id之类的东西,我想接收包含_id = user_id且包含其所有文章的用户。
最佳答案
由于各种原因,这是最可怕的想法。
首先,BSON文档大小限制为16MB。您根本无法在文档中添加更多内容。嵌入文档比“一对多”更适合“一对(很少)”关系。
至于用例:您在这里有什么问题?它是
对于给定的用户,文章是什么?
在REST方面,仅应在/users/:id/articles
被获取时返回文章,并且这些文章(以及仅有的文章)应作为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原则,以可扩展的方式解决问题。
关于node.js - MongoDB中的一对多关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33201509/