前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 Mongoose 基于 MongoDB 建模并设置关联

使用 Mongoose 基于 MongoDB 建模并设置关联

作者头像
Innei
发布2021-12-28 11:51:08
1.6K0
发布2021-12-28 11:51:08
举报
文章被收录于专栏:静之森

使用 Mongoose 简单的建立一个博客数据库以及模型之间的关联。

初始化项目

bash

代码语言:javascript
复制
1mkdir -p mongoose-model
2cd mongoose-model
3npm init -y
4npm i mongoose
5touch index.js

COPY

建立模型

首先建立对数据库的连接。

js

代码语言:javascript
复制
1const mongoose = require("mongoose");
2mongoose.connect("mongodb://127.0.0.1:27017/moogose-model-demo", {
3  useNewUrlParser: true
4});

COPY

建立 Post 模型。

js

代码语言:javascript
复制
1const Post = mongoose.model(
2  "Post", // 模型名称
3  new mongoose.Schema({
4    title: String,  
5    categories: [ // 分类与分类模型相关联
6      {
7        type: mongoose.SchemaTypes.ObjectId, // 关联分类模型中的唯一 _id
8        ref: "Category" // 关联的模型名称
9      }
10    ]
11  })
12);

COPY

建立 Category 模型。

js

代码语言:javascript
复制
1const Category = mongoose.model(
2  "Category",
3  new mongoose.Schema({
4    name: String
5  })
6);

COPY

插入几条数据。

js

代码语言:javascript
复制
1Post.insertMany([{
2  title: "第 1 条",
3},{
4  title: "第 2 条",
5}])
6Category.insertMany([{
7  name: "vuejs"
8},{
9  name: "nodejs"
10}])

COPY

建立关联

之所以要进行关联,是因为为了后期维护和可操作性。

对 Post 加入分类字段与之关联。

js

代码语言:javascript
复制
1;(async function() {
2  const cate1 = await Category.findOne({
3    name: "vuejs"
4  });
5  const cate2 = await Category.findOne({
6    name: "nodejs"
7  });
8  const post1 = await Post.findOne({
9    title: "第1篇帖子"
10  });
11  const post2 = await Post.findOne({
12    title: "第2篇帖子"
13  });
14
15  post1.categories = [cate1, cate2]; // 直接赋值即可
16  post2.categories = [cate1];
17  await post1.save();  // 保存修改
18  await post2.save();
19  const posts = await Post.find().populate("categories");
20  //  console.log(posts[0], posts[1]);
21})();

COPY

首先把 Post 和 Category 找出来,然后把分类字段改掉,最后别忘了保存。

populate()可以跟踪关联的_id,输出详细的内容。

输出内容如下:

js

代码语言:javascript
复制
1{
2  categories: [
3    { _id: 5d30626d7fc5f875b856e403, name: 'vuejs', __v: 0 },
4    { _id: 5d30626d7fc5f875b856e402, name: 'nodejs', __v: 0 }
5  ],
6  _id: 5d3061a43f97af74e8e62f38,
7  title: '第1篇帖子',
8  __v: 22
9} {
10  categories: [ { _id: 5d30626d7fc5f875b856e403, name: 'vuejs', __v: 0 } ],
11  _id: 5d3061bb5617a5750523af66,
12  title: '第2篇帖子',
13  __v: 22
14}

COPY

使用分类模型反查文章

因为分类模型中不存在对 Post 的记录所以查询的时候要建立虚拟字段。首先要修改 Category 的模型。

js

代码语言:javascript
复制
1CategorySchema.virtual("posts", {
2  // 定义一个虚拟字段
3  ref: "Post", // 关联的模型
4  localField: "_id", // 内建 ☞Category 的键
5  foreignField: "categories", // 外键 ☞ Post 的键
6  justOne: false // 结果只有一条还是多条
7});
8const Category = mongoose.model("Category", CategorySchema);

COPY

修改之后直接就可以查询到了。

js

代码语言:javascript
复制
1;(async function() {
2  const cates = await Category.find()
3    .populate("posts")
4  //  .lean();
5    console.log(cates[0].posts, cates[1].posts);
6  // console.log(JSON.stringify(cates))
7  // console.log(cates)
8})();

COPY

https://github.com/Innei/Back-End-Study/blob/master/express-demo/db.js

注意

  1. 立即执行函数记得一定要分号,前面加分号。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 初始化项目
  • 建立模型
  • 建立关联
  • 使用分类模型反查文章
  • 注意
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档