我是Mongo / Mongoose的新手,我在模特中遇到的情况我可能会新建一些有关系的模型(一对一,一对多,多对多)。我已经研究了一些关于如何在Mongoose上创建关系的好例子,如下所示:
Understanding Relationships & Foreign Keys in Mongoose
然而,根据Mongo Docs,有两种方法可以存储关系:在同一个集合中或通过文档引用。
我对此主题有3个问题。
1-我应该何时使用方法?这是基于我的业务数据的要求以及我将如何执行搜索? 2-结合两种类型的数据存储是一种好习惯吗? 3-如何配置Mongoose以将关系数据存储在同一集合或文档参考中?
非常感谢
答案 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);
现在,如果您的应用程序静态不变并且您不关心可伸缩性,那么这似乎是更简单,更好的方法。我建议你做的是将你的顾虑分开。
根据该示例架构,您可以说author
和comments
可以而且应该是他们自己的集合。
作者(有很多帖子,有很多评论)
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);