(mongodb)mongo-relation

观看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

  1. 先插入两条数据
 await Category.insertMany([
     {name: 'nodejs'},
     {name: 'vueejs'},
   ])
   const posts = await Post.find()

可以看到这两条数据和posts的两条数据id是不冲突的

  1. 找分类
  2. 找帖子
  3. 设置第一篇帖子的分类 设置第二篇帖子的分类
//找一个分类和一个帖子 然后设置
  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…
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值