Mongo / Mongoose,关系存储

时间:2016-06-26 05:49:58

标签: node.js mongodb mongoose

我是Mongo / Mongoose的新手,我在模特中遇到的情况我可能会新建一些有关系的模型(一对一,一对多,多对多)。我已经研究了一些关于如何在Mongoose上创建关系的好例子,如下所示:

Understanding Relationships & Foreign Keys in Mongoose

然而,根据Mongo Docs,有两种方法可以存储关系:在同一个集合中或通过文档引用。

https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

我对此主题有3个问题。

1-我应该何时使用方法?这是基于我的业务数据的要求以及我将如何执行搜索? 2-结合两种类型的数据存储是一种好习惯吗? 3-如何配置Mongoose以将关系数据存储在同一集合或文档参考中?

非常感谢

1 个答案:

答案 0 :(得分:3)

如果你想使用关系,你应该使用像MySQL这样的关系数据库,如果你不喜欢SQL那么你可以使用像RethinkDB这样的数据库,Mongo中的关系是不可思议的。话虽如此,我会尽力回答你的问题。

1 - 我什么时候应该使用方法?

IMO,如果可以的话,你应该始终保持数据分开。例如,在博客中,您希望将评论和帖子保留在自己的集合中,并将帖子作为与评论集合的hasMany关系引用。是的,您只需在帖子文档中添加评论,但是我们要说您希望为用户添加一种方式来查看他们的评论,然后您必须构建一个查询来查看每个帖子的每个评论都很糟糕。

2 - 结合两种类型的数据存储是一种好习惯吗?

这个问题似乎与第一个问题相同

3 - 如何配置Mongoose以将关系数据存储在同一集合或文档参考中?

首先让我们清楚一点,Mongo将文档存储在集合中。 要在文档中包含关系,您只需将属性添加到将填充它的文档中。博客示例:

import mongoose from 'mongoose'

const Schema = mongoose.Schema

const postSchema = new Schema({
    title: String,
    date: String,
    author: String,
    text: String,
    comments: Array
})
export default mongoose.model('Post', postSchema);

现在,如果您的应用程序静态不变并且您不关心可伸缩性,那么这似乎是更简单,更好的方法。我建议你做的是将你的顾虑分开。

根据该示例架构,您可以说authorcomments可以而且应该是他们自己的集合。

作者(有很多帖子,有很多评论)

import mongoose from 'mongoose'

const Schema = mongoose.Schema

const authorSchema = new Schema({
    name: String,
    posts: [{
        type: Schema.Types.ObjectId,
        ref: 'Post'
    }],
    comments: [{
        type: Schema.Types.ObjectId,
        ref: 'Comment'
    }]
})
export default mongoose.model('Author', authorSchema);

评论(属于作者,有一个帖子)

import mongoose from 'mongoose'

const Schema = mongoose.Schema

const commentSchema = new Schema({
    author: {
        type: Schema.Types.ObjectId
        ref: 'Author'
    },
    post:{
        type: Schema.Types.ObjectId,
        ref: 'Post'
    }
})
export default mongoose.model('Comment', commentSchema);

帖子(属于作者,有很多评论)

import mongoose from 'mongoose'

const Schema = mongoose.Schema

const postsSchema = new Schema({
    author: {
        type: Schema.Types.ObjectId
        ref: 'Author'
    },
    title: String,
    date: String,
    text: String,
    comments: [{
        type: Schema.Types.ObjectId,
        ref: 'Comment'
    }]
})
export default mongoose.model('Post', postsSchema);