观看up全栈之巅(使用Mongoose基于MongoDB建模并设置关联)所作学习记录
观看地址:https://www.bilibili.com/video/BV1wb41157FX
- 安装mongoose:
npm i mongoose
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/mongo-relation',{
useNewUrlParser: true,
useUnifiedTopology: true
})
//假如做一个博客系统 Post表示帖子
const Post = mongoose.model('Post',new mongoose.Schema({
//title: String,也可以 但是一般写成对象的形式
title:{type: String},
body: {type: String}
}))
async function main() {
//查询之前必须要有数据 所以这里要await保证查询之前先添加数据
//insertMany([])是往数据库里插入多条数据
// await Post.insertMany([
// {title:'第1篇帖子',body:'内容1'},
// {title:'第2篇帖子',body:'内容2'}
// ])
const posts = await Post.find()
console.log(posts);
}
main()
如果某篇帖子属于某一个分类,还需要定义一个分类的模型。如果直接定义一个分类的类型为字符串,那么数据同步就会成问题。所以应该用关联。
//假如做一个博客系统 Post表示帖子
//不要在分类里记录有哪些文章,而是在文章里记录它所属的分类 按照属于的关系在模型里建字段
//因为当文章数量无限增长时,一个字段里可能就会有上万篇文章
//但是需要注意这里的类型不是string,而是一个特殊的id类型(类似于主键)
const Post = mongoose.model('Post',new mongoose.Schema({
//title: String,也可以 但是一般写成对象的形式
title:{type: String},
body: {type: String},
//ref表示自动关联的模型
category:{ type : mongoose.SchemaTypes.ObjectId,ref:'Category'}
}))
const Category = mongoose.model('Category',new mongoose.Schema({
//title: String,也可以 但是一般写成对象的形式
name:{type: String}
}))
实现找一个帖子然后修改它的分类id
-
先插入两条数据
await Category.insertMany([ {name: 'nodejs'}, {name: 'vueejs'}, ]) const posts = await Post.find()
可以看到这两条数据和posts的两条数据id是不冲突的
- 找分类
- 找帖子
- 设置第一篇帖子的分类 设置第二篇帖子的分类
//找一个分类和一个帖子 然后设置 const cat1 = await Category.findOne({name:'nodejs'}) const post1 = await Post.findOne({title:'第1篇帖子'}) const post2 = await Post.findOne({title:'第2篇帖子'}) //这里post1.category的category是Post字段中的category //cat1._id/cat1都可以 因为mongo会自动去寻找 //这里把两篇帖子都放到nodejs分类中 post1.category = cat1 post2.category = cat1 await post1.save() await post2.save() const posts = await Post.find() console.log(posts);
关联后:
原来:
如果要查询详细数据的话加上populate(‘字段名’)
const posts = await Post.find().populate('category')
可以看到现在的category已经变成一个对象
但是可能会出现一篇文章属于多个分类的情况
- 增加categories 注意是数组的形式 因为可能属于多个分类
- 这里假设第一篇帖子属于分类nodejs和vuejs,第二篇帖子属于vuejs