gpt4 book ai didi

node.js - MongoDB 中的一对多关系

转载 作者:太空宇宙 更新时间:2023-11-04 00:49:28 25 4
gpt4 key购买 nike

目前我正在研究 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 的限制。您根本无法在文档中放入更多内容。嵌入文档更适合“一对(非常)少”关系,而不是“一对多”关系。

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

For a given user, what are the articles?

REST 方面,您应该仅在 GETed /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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com