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

使用Mongoose的populate方法实现多表关联查询

MongoDB在3.2以上的版本有类似于 join 的 $lookup 聚合操作符,其实 Mongoose 有一个更强大的替代方法,叫做populate ( ),它允许你在其他集合中引用文档,实现更简洁优雅的查询操作...业务需求如下:查询文章信息,并显示文章的分类以及文章的作者信息,下面用 populate 来实现这个查询需求。 1....定义用户的schema生成模型导出,文件名 user.js // 引入自定义的数据库连接文件 var mongoose = require('....定义文章的 schema 生成模型导出,文件名 article.js 通过给 schema 中的关联字段添加 ref 与指定的模型建立关联 // 引入自定义的数据库连接文件 var mongoose =...(err,docs){ console.log(docs); }) 通过给 populate 中传入所关联的字段与指定的集合进行关联查询,在 exec( ) 的回调方法中获取查询的结果。

3.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    本文源自工作中的一个问题,在使用 Mongoose 做关联查询时发现使用 populate() 方法不能直接关联非 _id 之外的其它字段,在网上搜索时这块的解决方案也并不是很多,在经过一番查阅、测试之后...MongoDB 官方文档 #lookup-aggregation[2] Mongoose Virtual 和 populate 实现 Mongoose 的 populate 方法默认情况下是指向的要关联的集合的..._id 字段,并且在 populate 方法里无法更改的,但是在 Mongoose 4.5.0 之后增加了虚拟值填充[3],以便实现文档中更复杂的一些关系。...如果你需要填充的虚拟值的显示是在 JSON 序列化中输出,就需要设置 toJSON 属性,例如 console.log(JSON.stringify(res))。...另外一种是 Mongoose 提供的 populate 方法,这种方式写起来,代码会更简洁些,这里需要注意如果关联的字段是非 _id 字段,一定要在 Schema 中设置虚拟值填充,否则 populate

    26.5K20

    你真的了解mongoose吗?

    该 versionKey 是每个文档首次创建时,由 mongoose 创建的一个属性。包含了文档的内部修订版。此文档属性是可配置的。默认值为__v。...定义一个具有给定名称的虚拟属性,该名称可以获取/设置这个路径 索引 你可以用 schema 类型选项声明 MongoDB 的索引。 index: 布尔值,是否在属性中定义一个索引。...unique: 布尔值,是否在属性中定义一个唯一索引。 sparse: 布尔值,是否在属性中定义一个稀疏索引。...看完Models,最后让我们来看下在实战中比较有用的Populate 联表(Populate) Mongoose 的 populate() 可以连表查询,即在另外的集合中引用其文档。...Populate() 可以自动替换 document 中的指定字段,替换内容从其他 collection 中获取。

    41.6K30

    mongoose官方文档总结

    你也可以设定虚拟值的 setter ,下例中,当你赋值到虚拟值时,它可以自动拆分到其他属性: personSchema.virtual('fullName')....Query实例有一个.then()函数,用法类似Promise 我们看一下demo,查询persons表中name中属性last为Ghost值的文档,只查询 name和occupation两个字段 const...demo MongoDb 在 3.2之后,也有像 sql 中的 join 聚合操作,那就死$lookup,而 mongoose 拥有更强大的 populate,可以让你在别的 collection...Populate 可以自动替换 document 中的指定字段,替换内容从其他 collection 获取,我们填充(populate)单个或者多个 document、单个或者多个对象,甚至是 query...所有储存在此的_id 都必须是 Story model 中的 document 的 _id 保存 refs 保存 refs 与保存普通属性一样,把_id的值赋给他就好了 const author

    20.6K40

    MongoDB x Mongoose: 实现类似 Join 的功能

    官方示例 其他 当前的实现全部都是基于 Mongoose 完成的 官方示例 var mongoose = require('mongoose'), Schema = mongoose.Schema...('list').then((res) => { // 然后使用 populate 来获取引用的数据 console.log(res); }), 其他 其实不一定要使用 ObjectID 类型来引用...Schema.Types.ObjectId 可以根据需要改成其他的类型,但是不推荐 作为 ref 的 field 一定要记得保存成 ObjectID 的模式 populate() 对应的 ref field...如果一直返回 null 的话那么就很可能 schema 出错, 可能的错误原因: ref field 不是 ObjectID 的类型, 保存的时候一定要记得保存成 ObjectID 类型, MongoDB...使用 populate() 之前应该返回一个 ID, 使用 populate() 之后应该返回一个 Object

    90110

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

    接着我们在我们的 app.js 文件中导入 mongoose ,并且通过 mongoose 提供的接口连接我们的 MongoDB 数据库: // ... const mongoose = require...设计数据库的 Schemas 和 Models 我们要在服务器中通过 mongoose 与 MongoDB 数据库进行交互,需要定义 Schema 和 Model。...我们还可以看到,在我们的 productSchema 中,manufacturer 数据结构我们定义了一个 ref 属性,这是 MongoDB 为我们提供的类似关系数据库的外键功能,允许我们创建一对多的数据文档...,所以 productSchema 的 manufacturer 属性对应着的数据类型为一条 Manufacturer 记录。...属性要为某个 Manufacturer 的 ObjectId,比如我们这里添加小米的新产品 Mix Alpha : ?

    3.1K10

    在线考试系统(vue2 + elementui + express4 + MongoDB)

    /common/img/logo.png" alt=""> mongoose 操作mongodb的 npm i mongoose --save 就不一一列举所有的插件了(没有用vuex) 开发上的一些事...初始化一条数据 如果对mongodb,mongoose没有基础的了解,建议看一看mongoose深入浅出 ,mongoose基础操作 // controllers/student.js const...集合: 在该集合中,学生参加过的考试记录,存在exams数组中,当想实现分页查询几条数据的时候,需要用到$slice $slice:[start,size] 第一个参数表示,数组开始的下标,第二个表示截取的数量...mongodb本来就是非关系型的数据库,但是有很多时候不同的集合直接是需要关联的,这是就用到了mongoose提供的populate 直接看图,不同集合直接的关联,用的就是_id,比如下图中,学生参加的考试...数据中既有试卷的信息,也有很多题目。题目都属于该试卷,改试卷又属于当前登录系统的老师(即创建试卷的老师)。

    8.9K40

    深入浅出mongodb之实战

    routes这个文件是存放路由的,主要编写前端发送请求和响应数据给前端 views这个文件夹中ejs文件结尾的文件是后端的模板文件 app.js是入口文件,模板配置和总路由文件 package.json...useUnifiedTopology: true }); 设置跨域 在开发中,我们采用的都是前后端分离的状态,在本地的开发环境中我们无法避免的会遇到跨域[3]的情况,我们这里设置允许所有的源访问 app.use...实际上在真正的开发环境中,如果我们这么设置允许所有的的源都可以访问会有很多问题,我们可以使用cors[4]来代替它 当然如果在生产中我们采用nginx部署之后,就不存在跨域了?...const mongoose = require("mongoose"); const Scheme = mongoose.Schema; const ObjectId = mongoose.Types.ObjectId...,创建index.js文件: const mongoose = require("mongoose"); const model = mongoose.model.bind(mongoose); const

    1.7K10

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

    非关系型数据库的解决思路: 在文章的Collection中增加一个SubCollection,SubCollection中可以存放用户信息,如用户名,只要有用户喜欢了文章,在这篇文章的文档中的子文档下插入一条记录即可...'); mongoose.connect('mongodb://127.0.0.1:27017/blog'); 定义一个Schema(也就是Mongodb中的Collections集合),更多字段类型,...Mongoose高级用法 关联关系的建立 大家会发现dhHelper中userSchema和articleSchema是有对应关系的(具体的说是“一对多的关系”),那么这个对应关系是怎么设计的呢?..._user.username是出不来数据的,原因就是我们需要用到populate()函数。...关于NodeJS中数据库的知识,就写这么多了,想要更多的了解有关Mongoose的用法,请参考官方文档:Mongoosejs Guide。文档写得非常详细! Have a good luck~

    2.8K10
    领券