Mongodb 帖子、评论、保存和喜欢的数据结构
Mongodb data structure on posts, comments, save and likes
我刚刚学习如何使用 MEANJS 构建网站,我正在构建我的数据,但不确定最佳实践,我对 NoSql 概念还很陌生。
我需要存储:
questions
answers
likes
saved_questions
在我的应用程序中,我允许用户保存问题以供稍后查看,并且他们可以访问他们发布的任何答案。我为每个问题提供了一些统计数据(即喜欢的数量、答案的数量等)
我是否应该为 "question" 和其中的所有内容创建一个文档:
{_id: <ObjectId>,
user_id: <ObjectId>,
question: 'how can we....',
answers: [{user_id: <ObjectId>, answer: ''}],
likes: [{user_id: <ObjectId>}],
saves: [{user_id: <ObjectId>}]
}
或者我应该为每个文件制作多个文件?还是我应该同时使用这两种方法?
我至少有两个数据库模型,一个用于用户,另一个用于问题。 MEAN.JS 样板的一大优点是它已经带有一个用户模块,其中包含注册、login/logout 功能。因此,一旦您部署了新项目,您就可以解决这个问题。
既然已经解决了这个问题,我将使用 Yo Generator 创建一个名为 Question 的新 CRUD 模块。您可以手动添加文件,但 Yo 会自动将文件放置在正确的位置,并附有示例代码以帮助您进行设置,从而帮助您快速准确地完成此操作。要了解如何使用 Yo 生成器,我会查看 MEAN.JS 文档的 Yo Generator Section。
从您应用的根目录,运行 yo meanjs:crud-module Question
。这将创建数据库模型所需的所有必要文件,以及前端和后端的一个新模块,其中包含如何 create/read/update/delete 问题的示例。现在,如果您登录,您将在菜单栏中看到新模块。
然后打开app/controllers/models/question.server.model.js
。这是您可以定义新数据库模型的文件。根据您希望数据的 complex/relational 方式,您希望 Mongoose 模型看起来像这样:
var QuestionSchema = new Schema({
created: {
type: Date,
default: Date.now
},
title: {
type: String,
default: '',
trim: true,
required: 'Title cannot be blank'
},
question: {
type: String,
default: '',
trim: true
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
answers: {
type: Array,
default: []
},
likes: {
type: Array,
default: []
},
saves: {
type: Array,
default: []
}
});
显然这是非常简化的。您可能希望为点赞、保存和报告创建单独的 mongoose 模型,以便您可以存储关于每个的更多数据(即:user_id、日期、reporting/saving/liking 的原因等)阅读更多关于如何根据您的需要制作完美的猫鼬模型,我肯定会在 mongoosejs.com.
查看有关 Mongoose Schemas 的文档
希望对您有所帮助!
继续...
要获得给定用户操作的列表,我会继续为每种类型的操作(评论、喜欢、保存)创建一个新的 Mongoose 架构,并在其中存储用户操作的详细信息。例如,在 Answers 模式中,您可以存储实际的评论、发表评论的人、发表评论的时间、提出的问题等。然后只需查询给定用户 ID 的操作表即可检索您的操作列表。
所以..
var QuestionSchema = new Schema({
created: {
type: Date,
default: Date.now
},
title: {
type: String,
default: '',
trim: true,
required: 'Title cannot be blank'
},
question: {
type: String,
default: '',
trim: true
},
user: {
type: Schema.ObjectId,
ref: 'User'
}
});
var AnswerSchema = new Schema({
created: {
type: Date,
default: Date.now
},
question: {
type: Schema.ObjectId,
ref: 'Question'
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
answer: {
type: String,
default: '',
trim: true
}
});
我刚刚学习如何使用 MEANJS 构建网站,我正在构建我的数据,但不确定最佳实践,我对 NoSql 概念还很陌生。
我需要存储:
questions
answers
likes
saved_questions
在我的应用程序中,我允许用户保存问题以供稍后查看,并且他们可以访问他们发布的任何答案。我为每个问题提供了一些统计数据(即喜欢的数量、答案的数量等)
我是否应该为 "question" 和其中的所有内容创建一个文档:
{_id: <ObjectId>,
user_id: <ObjectId>,
question: 'how can we....',
answers: [{user_id: <ObjectId>, answer: ''}],
likes: [{user_id: <ObjectId>}],
saves: [{user_id: <ObjectId>}]
}
或者我应该为每个文件制作多个文件?还是我应该同时使用这两种方法?
我至少有两个数据库模型,一个用于用户,另一个用于问题。 MEAN.JS 样板的一大优点是它已经带有一个用户模块,其中包含注册、login/logout 功能。因此,一旦您部署了新项目,您就可以解决这个问题。
既然已经解决了这个问题,我将使用 Yo Generator 创建一个名为 Question 的新 CRUD 模块。您可以手动添加文件,但 Yo 会自动将文件放置在正确的位置,并附有示例代码以帮助您进行设置,从而帮助您快速准确地完成此操作。要了解如何使用 Yo 生成器,我会查看 MEAN.JS 文档的 Yo Generator Section。
从您应用的根目录,运行 yo meanjs:crud-module Question
。这将创建数据库模型所需的所有必要文件,以及前端和后端的一个新模块,其中包含如何 create/read/update/delete 问题的示例。现在,如果您登录,您将在菜单栏中看到新模块。
然后打开app/controllers/models/question.server.model.js
。这是您可以定义新数据库模型的文件。根据您希望数据的 complex/relational 方式,您希望 Mongoose 模型看起来像这样:
var QuestionSchema = new Schema({
created: {
type: Date,
default: Date.now
},
title: {
type: String,
default: '',
trim: true,
required: 'Title cannot be blank'
},
question: {
type: String,
default: '',
trim: true
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
answers: {
type: Array,
default: []
},
likes: {
type: Array,
default: []
},
saves: {
type: Array,
default: []
}
});
显然这是非常简化的。您可能希望为点赞、保存和报告创建单独的 mongoose 模型,以便您可以存储关于每个的更多数据(即:user_id、日期、reporting/saving/liking 的原因等)阅读更多关于如何根据您的需要制作完美的猫鼬模型,我肯定会在 mongoosejs.com.
查看有关 Mongoose Schemas 的文档希望对您有所帮助!
继续...
要获得给定用户操作的列表,我会继续为每种类型的操作(评论、喜欢、保存)创建一个新的 Mongoose 架构,并在其中存储用户操作的详细信息。例如,在 Answers 模式中,您可以存储实际的评论、发表评论的人、发表评论的时间、提出的问题等。然后只需查询给定用户 ID 的操作表即可检索您的操作列表。
所以..
var QuestionSchema = new Schema({
created: {
type: Date,
default: Date.now
},
title: {
type: String,
default: '',
trim: true,
required: 'Title cannot be blank'
},
question: {
type: String,
default: '',
trim: true
},
user: {
type: Schema.ObjectId,
ref: 'User'
}
});
var AnswerSchema = new Schema({
created: {
type: Date,
default: Date.now
},
question: {
type: Schema.ObjectId,
ref: 'Question'
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
answer: {
type: String,
default: '',
trim: true
}
});