Mongodb数据结构上的帖子,评论,保存和喜欢

时间:2015-01-07 03:18:10

标签: javascript mongodb nosql

我正在学习如何使用MEANJS构建网站,我正在构建我的数据但不确定最佳实践,我对NoSql概念很新。

我需要存储:

questions
answers
likes
saved_questions

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

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

{_id: <ObjectId>,
 user_id: <ObjectId>,
 question: 'how can we....',
 answers: [{user_id: <ObjectId>, answer: ''}],
 likes: [{user_id: <ObjectId>}],
 saves: [{user_id: <ObjectId>}]
}

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

1 个答案:

答案 0 :(得分:2)

我至少有两个数据库模型,可能一个用于User,另一个用于Question。 MEAN.JS锅炉板的一大优点是它已经配备了一个完整的注册,登录/注销功能的用户模块。因此,只要部署新项目,就可以解决这个问题。

有了这个,我会使用Yo Generator创建一个名为Question的新CRUD模块。您可以手动添加文件,但是通过自动将文件放在正确的位置,Yo可以帮助您快速准确地完成这些操作,并提供示例代码以帮助您进行设置。要了解如何使用Yo Generator,我会查看MEAN.JS文档的Yo Generator Section

从您应用的根目录中,运行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: []
    }
});

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

我希望有所帮助!

续...

要获取给定用户的操作列表,我会继续为每种类型的操作(评论,喜欢,保存)制作新的Mongoose Schema,并在那里存储用户操作的详细信息。例如,在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
} 
});