Mongodb 关于帖子、评论、保存和点赞的数据结构

Moe*_*tib 3 javascript mongodb nosql

我刚刚学习如何使用 MEANJS 构建网站,并且正在构建我的数据,但不确定最佳实践,我对 NoSql 概念非常陌生。

我需要存储:

questions
answers
likes
saved_questions
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我允许用户保存问题以便稍后查看,并且他们可以访问他们发布的任何答案。我为每个问题提供一些统计数据(即喜欢的数量、答案的数量等)

我是否应该为“问题”及其内部所有内容创建一个文档:

{_id: <ObjectId>,
 user_id: <ObjectId>,
 question: 'how can we....',
 answers: [{user_id: <ObjectId>, answer: ''}],
 likes: [{user_id: <ObjectId>}],
 saves: [{user_id: <ObjectId>}]
}
Run Code Online (Sandbox Code Playgroud)

或者我应该为每个文件制作多个文件?或者我应该同时使用这两种方法?

小智 6

我至少有两个数据库模型,可能一个用于用户,另一个用于问题。MEAN.JS 样板的一大优点是它已经附带了一个具有注册、登录/注销功能的用户模块。因此,一旦部署新项目,您就可以解决这个问题。

既然已经解决了这个问题,我将使用 Yo Generator 创建一个名为 Question 的新 CRUD 模块。您可以手动添加文件,但 Yo 通过自动将文件放置在正确的位置来帮助您快速准确地完成此操作,并提供示例代码来帮助您进行设置。要了解如何使用 Yo 生成器,我将查看MEAN.JS 文档的Yo 生成器部分。

从应用程序的根目录运行yo meanjs:crud-module Question. 这将创建数据库模型所需的所有必要文件,以及前端和后端的新模块,其中包含如何创建/读取/更新/删除问题的示例。现在,如果您登录,您将在菜单栏中看到新模块。

然后打开app/controllers/models/question.server.model.js。您可以在该文件中定义新的数据库模型。根据您希望数据的复杂/关系程度,您希望 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: []
    }
});
Run Code Online (Sandbox Code Playgroud)

显然,这是非常简化的。您可能希望为喜欢、保存和报告创建单独的猫鼬模型,以便您可以存储有关每个模型的更多数据(即:user_id、日期、报告/保存/喜欢的原因等)。满足您需求的完美 mongoose 模型,我肯定会在 mongoosejs.com 上查看有关Mongoose Schemas的文档。

我希望这有帮助!

继续...

为了获取给定用户操作的列表,我将继续为每种类型的操作(评论、点赞、保存)创建一个新的 Mongoose 架构,并在其中存储用户操作的详细信息。例如,在答案模式中,您可以存储实际的评论、谁说的、何时说的、针对什么问题等。然后只需查询给定用户 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
} 
});
Run Code Online (Sandbox Code Playgroud)