【问题标题】:One-To-Many relation in MongoDBMongoDB中的一对多关系
【发布时间】:2016-01-17 00:55:04
【问题描述】:

目前我正在查看 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 包含他所有文章的用户。

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

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

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

    至于用例:您的问题是什么?这是

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

    在 REST 方面,您应该只在获取 /users/:id/articles 时返回文章,并且文章(并且只有文章)应该作为 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 原则。

    【讨论】:

      猜你喜欢
      • 2019-08-23
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2020-06-12
      • 2020-12-05
      • 2015-10-25
      相关资源
      最近更新 更多