首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在mongoose中创建多对多关系,填充不是一个函数

在mongoose中创建多对多关系,可以通过使用中间表来实现。中间表是一个连接两个模型的表,它包含两个外键,分别指向两个相关联的模型。

以下是在mongoose中创建多对多关系的步骤:

  1. 创建两个相关联的模型(例如,模型A和模型B)。
代码语言:txt
复制
const mongoose = require('mongoose');

// 创建模型A的Schema
const ASchema = new mongoose.Schema({
  // 定义模型A的属性
});

// 创建模型B的Schema
const BSchema = new mongoose.Schema({
  // 定义模型B的属性
});

// 创建模型A和模型B
const A = mongoose.model('A', ASchema);
const B = mongoose.model('B', BSchema);
  1. 创建中间表的模型,并定义两个外键字段,分别指向模型A和模型B。
代码语言:txt
复制
const ABSchema = new mongoose.Schema({
  a: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'A'
  },
  b: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'B'
  }
});

const AB = mongoose.model('AB', ABSchema);
  1. 在模型A和模型B中添加虚拟属性,用于获取与其相关联的模型。
代码语言:txt
复制
ASchema.virtual('bs', {
  ref: 'AB',
  localField: '_id',
  foreignField: 'a'
});

BSchema.virtual('as', {
  ref: 'AB',
  localField: '_id',
  foreignField: 'b'
});
  1. 使用populate方法填充多对多关系。
代码语言:txt
复制
A.findById(aId)
  .populate('bs')
  .exec((err, a) => {
    if (err) {
      // 错误处理
    } else {
      // a包含与其相关联的所有模型B
    }
  });

B.findById(bId)
  .populate('as')
  .exec((err, b) => {
    if (err) {
      // 错误处理
    } else {
      // b包含与其相关联的所有模型A
    }
  });

在上述代码中,aId和bId分别是模型A和模型B的ID。

这种多对多关系的创建方式可以适用于许多场景,例如用户和角色之间的关系、文章和标签之间的关系等。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云数据库MongoDB:https://cloud.tencent.com/product/mongodb
  • 腾讯云云服务器CVM:https://cloud.tencent.com/product/cvm
  • 腾讯云云函数SCF:https://cloud.tencent.com/product/scf
  • 腾讯云云原生容器服务TKE:https://cloud.tencent.com/product/tke
  • 腾讯云对象存储COS:https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/bcs
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Mongoose 实现关联查询和踩坑记录

本文源自工作一个问题,使用 Mongoose 做关联查询时发现使用 populate() 方法不能直接关联非 _id 之外的其它字段,在网上搜索时这块的解决方案也并不是很多,经过一番查阅、测试之后...,如果很复杂的一关系,表达起来就很复杂,也要注意内嵌还有一个最大的单条文档记录限制为 16MB。...author.js 创建 model/author.js 定义作者的 Schema,代码的 ref 表示要关联的 Model 是谁, Schema 定义好之后后面我会创建 Model const mongoose...4.5.0 之后增加了虚拟值填充[3],以便实现文档更复杂的一些关系。...可以创建 Schema 时第二个参数 options 设置,也可以使用创建的 Schema 对象的 set 方法设置。

26.5K20

mongoose官方文档总结

相当于关系型数据库的表 document相当于一条数据,在这里有特别需要注意的一点是: collection不要求文档有相同的结构,一个collection文档不必具有相同的fileds,对于单个...:布尔值 是否这个属性创建索引 unique:布尔值    是否这个属性创建唯一索引 sparse:布尔值    是否这个属性创建稀疏索引 四、Connections-连接 可以使用 mongoose.connect...比如上例,Tank这个model对应数据库tanks这个collection .model()这个函数 schema做了拷贝 确保调用.model()之前把所有需要的东西都加进shema里。...Mongoose,意味着你可以在里嵌套另一个schema。...stuff next() }) mongoose5.x ,除了手动调用 next 函数,还可以返回一个 Promise,甚至是 async/await。

20.6K40
  • 我的NodeJS学习之路6(数据库设计及开发)

    关系型数据库的解决思路: 需要添加一张喜欢表: favorite,里面两个字段:articleId和userId,表述的意思是:xx文章被xxx些用户喜欢了。文章和喜欢的用户为关系。...非关系型数据库的解决思路: 文章的Collection增加一个SubCollection,SubCollection可以存放用户信息,如用户名,只要有用户喜欢了文章,在这篇文章的文档的子文档下插入一条记录即可...是不是关系型数据库的设计思路更加灵活清晰?! 好了,对于关系型数据库和非关系型数据库的讨论就不再深入了,没有好坏之分,各有优势。...Mongoose高级用法 关联关系的建立 大家会发现dhHelperuserSchema和articleSchema是有对应关系的(具体的说是“一关系”),那么这个对应关系是怎么设计的呢?...通过查找资料我的总结如下: 如果只需要通过A集合查询B集合,而不需要反过来查询,也就是单向的关系(如文章和评论,只需要展示文章的时候,将其评论展示即可),那么可以A集合建立一个子集合B。

    2.8K10

    Mongoose 插件记录Node.js API日志

    那么如何创建一个 Mongoose 插件,以更清洁的方式为你进行记录并简化 API 日志? Mongoose 的插件是什么? Mongoose ,模式是可插入的。...插件就像一个函数,你可以模式中使用它,并在模式实例上一次次地重用。 Mongoose 还提供全局插件,你可以将其用于所有模式。...('Log', LogSchema) 步骤2:编写一个函数来获得 2 个 JSON 之间的差异 所以下一步是你需要一个可重用的函数,它将动态创建两个 JSON 的 diff。...如果当前对象的 value 不等于前一个对象相同属性的值:base[key] 如果该值是对象本身,我们递归调用函数changes 直到它得到一个值,它最终将作为 result[key]=value 存储...步骤3:创建一个插件用来 diff 并将其保存到数据库 现在我们需要跟踪数据库的前一个 document 并在保存到 mongodb 之前创建一个 diff。

    2.7K40

    初试MongoDB学习之Mongoose的使用

    Mongoose本质是一个对象文档模型(ODM)库, 他Node原生的MongoDB模块进行了一部优化封装,并且提供了更多的功能。...#Mongoose的优势 可以像操作对象一样操作数据库 可以为文档创建一个模式结构(Schema) 可以对模型的文档/文档进行验证 数据可以通过类型转换为对象模型 可以使用中间件来应用业务逻辑挂钩 比...文档 —— 是MongoDB的核心概念,是键值一个有序集,JavaScript里文档被表示成对象。同时它也是MongoDB数据的基本单元,非常类似于关系型数据库管理系统的行,但更具表现力。...集合 —— 由一组文档组成,如果将MongoDB一个文档比喻成关系型数据库的一行,那么一个集合就相当于一张表。...#创建model(集合) let personModel= mongoose.model('person', personSchema); person:数据库的集合名称,当我们其添加数据时如果person

    5.9K20

    Week14-服务端选型:磨刀不如砍柴功

    这里,讲师再次推荐了自己的一个课程,鉴于此次购买课程自己不是很满意,这里,我觉得自己补充mongoose的基础知识就够了,总结至:https://www.yuque.com/liugezhou/gofftg...以后访问接口,都在header带上token。 优缺点 优点:不占用服务器内存、多进程,服务器,不受影响、不受跨域限制 缺点:无法快速封禁登录的用户。...区别 Session用户信息存储服务端 JWT用户信息存储客户端 代码演示 首先需要第三方库:koa-jwt 和 jsonwebtoken 然后,简单jwt以及loginCheck中间价进行了一个介绍...,于是回头查看一些表结构的时候,就不容易看出来一些表的关联关系,如果我们新建表的时候就去设置外键表的关联,首先表结构一目了然,且新增(外键关联的主键没有值得时候)会有错误提示,删除主键表的时候,关联的主键内容也会删掉...weibo_db’,‘root’,‘liugezhou1205’,{host:‘localhost’,dislect:‘mysql’}) 建模: 数据库建表字段长度为255,varchar为可变长度,并不是会占用这么的空间

    2K30

    Nuxt + Koa2 + Mongodb 手撸一个网上商城

    // 页面设置layout export default { layout: 'blank' //默认是default } // layout ... Nuxt.js 里面定义带参数的动态路由,需要创建对应的以下划线作为前缀的 Vue 文件 或 目录。...–简而言之就是fetch 和 asyncData 组件上不能用。 Vuex ⚠️nuxt,vuex需要导出一个方法。...MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)组成。...Schema 可以定义每个文档存储的字段,及字段的验证要求和默认值。 mongoose.model() 方法将模式“编译”为模型。模型就可以用来查找、创建、更新和删除特定类型的对象。

    7.8K10

    Nodejs和Mongodb的连接器Mongoose

    ,后面我们会学习如何创建文档并插入内容。 MongoDB,多个Document可以组成Collection(以下简称集合),多个集合又可以组成数据库。...文档 —— 是MongoDB的核心概念,是键值一个有序集,JavaScript里文档被表示成对象。同时它也是MongoDB数据的基本单元,非常类似于关系型数据库管理系统的行,但更具表现力。...集合 —— 由一组文档组成,如果将MongoDB一个文档比喻成关系型数据库的一行,那么一个集合就相当于一张表。...如果我们要通过Mongoose创建一个“集合”并其进行增删改查,该怎么实现呢,到这里我们就要先了解Schema(数据属性模型)、Model、Entity了。 好,下面就开始去深入了解它们吧!... TestModel = db.model("test1", TestSchema); test1:数据库的集合名称,当我们其添加数据时如果test1已经存在,则会保存到其目录下,如果未存在,则会创建

    5.9K41

    Nuxt + Koa2 + Mongodb 手撸一个网上商城

    // 页面设置layout export default { layout: 'blank' //默认是default } // layout ... Nuxt.js 里面定义带参数的动态路由,需要创建对应的以下划线作为前缀的 Vue 文件 或 目录。...--简而言之就是fetch 和 asyncData 组件上不能用。 Vuex ⚠️nuxt,vuex需要导出一个方法。...MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)组成。...Schema 可以定义每个文档存储的字段,及字段的验证要求和默认值。 mongoose.model() 方法将模式“编译”为模型。模型就可以用来查找、创建、更新和删除特定类型的对象。

    9.4K10

    MongoDB增删改查操作

    创建集合 创建集合分为两步,-是对对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。...// mongoose.Schema() 是一个构造函数,要new一个实例对象 //2、设定集合规则 const courseSchema = new mongoose.Schema({ name...: String, author: String , isPub1ished: Boolean }); //3、使用规则创建集合 这里创建的集合也是一个构造函数 const Course...实际在数据库中产生的集合名为courses 2.创建文档 创建文档实际上就是向集合插入数据。 方法1 分为两步: ①创建集合实例。 ②调用实例对象下的save方法将数据保存到数据库。...,例如文章信息和用户信息存储不同集合,但文章是某个用户发表的 要查询文章的所有信息包括发表用户,就需要用到集合关联。

    6.5K20

    从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(二)

    迷你全栈电商应用实战系列的第二篇教程,我们将通过基于 Node.js 平台的 Express[1] 框架实现后端 API 数据接口,并且将数据存储 MongoDB[2] 。...我们还可以看到,我们的 productSchema ,manufacturer 数据结构我们定义了一个 ref 属性,这是 MongoDB 为我们提供的类似关系数据库的外键功能,允许我们创建的数据文档...接着我们通过 model 来创建对于的数据模型,然后导出我们创建好的数据模型。这里的 model 就是经典的 MVC 设计模式的 Model。...所有访问 /api/v1 及其子路径如 /api/v1/xxx 都会激活 api 处理函数经典的 MVC 设计模式,api 也被成为 Controllers 。...•使用 POSTman 来测试我们编写的 API 相信通过本篇教程的学习,你使用 Node 和 Express 编写 API 后端服务器有了一个基本的了解,现在我们了解了 Vue 基础知识,了解了如何搭建后端服务器

    3.1K10

    mongodb原生node驱动

    Collection MongoDB并没有表的概念,我们需要一个集合. 1、在数据库创建一个collection集合对象 db.createCollection('mycollection',function...,如果一个已经存在的collection使用createcollection方法,也可以直接访问该collection-driver,并不会覆盖。...不使用create并没有创建实际的collection. 2、在数据库彻底销毁一个collection db.dropCollection('mycollection',function(err,result...){ }) 为collection添加数据   添加数据之前,我们要知道node mongodb driver 与mongodb数据类型存在一种映射关系(但是对于数据转换背后的处理机制我还不是理解的很清楚...(对于可选参数和回调函数都是可选项、而且这两种选项的可选值非常,但是大部分查询只会用到一小部分的选项值) 常用的 sort(文档排序,-1倒排序,1正排序)、     Field(查询语句并返回field

    2.6K60

    Mongoose学习参考文档

    1.2 准备工作 1.首先你必须安装MongoDB和NodeJS 2.项目只能够创建一个数据库连接,如下: var mongoose = require('mongoose'); //引用...mongoose模块 var db = mongoose.createConnection('localhost','test'); //创建一个数据库连接 3.打开本机localhost的test...remove方法 4.Sub Docs   如同SQL数据库2张表有主外关系Mongoose将2个Document的嵌套叫做Sub-Docs(子文档)   简单的说就是一个Document嵌套另外一个...  查询是数据库运用最多也是最麻烦的地方,这里Query解读的并不完善,仅仅是自己的一点领悟而已。...,数据的验证需要记住以下规则: 验证始终定义SchemaType 验证是一个内部中间件 验证是一个Document被保存时默认启用的,除非你关闭验证 验证是异步递归的,如果你的SubDoc验证失败

    24.2K90

    三步带你开发一个短链接生成平台

    前段时间开发【葡萄城社区】公众号时有一个功能是需要用网页授权认证地址生成二维码,但类似像下面这样的Url 即便是看也觉得很头疼了https://open.weixin.qq.com/connect/oauth2...那与其这样,不如我们自己来实现一个短链接平台吧,实现一个短链接平台原理上也非常简单,搞定两部分就行了:1.保存长短链接的对应关系。2.通过短链接查询长连接并重定向。...首先,我们先创建一个express工程 express -e demo change directory: > cd demo install dependencies:...这里的mongoose就是npm的一个包,主要是为程序提供连接mongodb并增删查改的功能。...由于我们生成短链接部分的api使用的是post方法,使用body-parser可以扩展一种body编码类型解析能力。

    3.1K30

    MongoDB增删改查操作

    1.创建集合 创建集合分为两步,-是对对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。...// mongoose.Schema() 是一个构造函数,要new一个实例对象 //2、设定集合规则 const courseSchema = new mongoose.Schema({ name...: String, author: String , isPub1ished: Boolean }); //3、使用规则创建集合 这里创建的集合也是一个构造函数 const Course...实际在数据库中产生的集合名为courses 1.创建文档 创建文档实际上就是向集合插入数据。 方法1 分为两步: ①创建集合实例。 ②调用实例对象下的save方法将数据保存到数据库。...使用id集合进行关联 使用populate方法进行关联集合查询 // 关联集合 ​ const mongoose = require('mongoose'); // 连接数据库 mongoose.connect

    6.2K10
    领券