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
} 
});