MongoDB中的一对多关系

时间:2015-10-18 18:14:36

标签: node.js 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的加入?

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

1 个答案:

答案 0 :(得分:1)

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

首先,有16MB的BSON文档大小限制。你根本无法在文档中添加更多内容。嵌入文档非常适合于“一对一”(非常少)"关系比一对多"。

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

  

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

REST明智地说,你应该只在/users/:id/articles获得GET时返回文章,并且文章(只有文章)应该作为JSON数组返回。

所以,你的模型似乎很自然。至于用户:

{
  _id: theObjectId,
  username: someString
  …
}

并且文章应如下所示:

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

因此,当您为/users/:id调用REST服务时,您只需查找

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

调用/users/:id/articles时,您需要查找

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

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