AI智能
改变未来

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 = cat1post2.category = cat1await 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) 打赏
未经允许不得转载:爱站程序员基地 » mongo-relation