本文源自工作中的一个问题,在使用 Mongoose 做关联查询时发现使用 populate() 方法不能直接关联非 _id 之外的其它字段,在网上搜索时这块的解决方案也并不是很多,在经过一番查阅、测试之后...文档内嵌与引用模式 MongoDB 是一种文档对象模型,使用起来很灵活,它的文档结构分为 内嵌和引用 两种类型。...Virtual 和 populate 实现 Mongoose 的 populate 方法默认情况下是指向的要关联的集合的 _id 字段,并且在 populate 方法里无法更改的,但是在 Mongoose...另外一种是 Mongoose 提供的 populate 方法,这种方式写起来,代码会更简洁些,这里需要注意如果关联的字段是非 _id 字段,一定要在 Schema 中设置虚拟值填充,否则 populate.../mongoose-populate - END -
官方示例 其他 当前的实现全部都是基于 Mongoose 完成的 官方示例 var mongoose = require('mongoose'), Schema = mongoose.Schema...}); }) Story .findOne({ title: /timex/ }) .populate('_creator') .exec(function(err, story...= require('mongoose'); const { Schema } = mongoose; const chemListChemSchema = new mongoose.Schema...Schema.Types.ObjectId 可以根据需要改成其他的类型,但是不推荐 作为 ref 的 field 一定要记得保存成 ObjectID 的模式 populate() 对应的 ref field...使用 populate() 之前应该返回一个 ID, 使用 populate() 之后应该返回一个 Object
MongoDB在3.2以上的版本有类似于 join 的 $lookup 聚合操作符,其实 Mongoose 有一个更强大的替代方法,叫做populate ( ),它允许你在其他集合中引用文档,实现更简洁优雅的查询操作...业务需求如下:查询文章信息,并显示文章的分类以及文章的作者信息,下面用 populate 来实现这个查询需求。 1....执行查询操作 // 注意使用 populate 需要引入用到的 model var ArticleCateModel=require('....(docs); }) // 文章表、分类表、用户表关联 ArticleModel.find({}).populate('cid').populate('author_id').exec(function...(err,docs){ console.log(docs); }) 通过给 populate 中传入所关联的字段与指定的集合进行关联查询,在 exec( ) 的回调方法中获取查询的结果。
,完整的连接选项看这里 bufferCommands:这是 mongoose 中一个特殊的选项(不传递给 MongoDB 驱动),它可以禁用 mongoose 的缓冲机制。...查询 对于 Mongoosecha 的查找文档很容易,它支持丰富的查询 MongoDB 语法。包括find、findById、findOne等。...upsert:布尔值,如果对象不存在,则创建它。默认值为 false。 omitUndefined:布尔值,如果为 true,则在更新之前删除值为 undefined 的属性。...看完Models,最后让我们来看下在实战中比较有用的Populate 联表(Populate) Mongoose 的 populate() 可以连表查询,即在另外的集合中引用其文档。...ref 选项告诉 Mongoose 在使用 populate() 填充的时候使用哪个 Model。
不这么做你可能会经常 收到看似毫无原因的 “connection closed” 错误。...demo MongoDb 在 3.2之后,也有像 sql 中的 join 聚合操作,那就死$lookup,而 mongoose 拥有更强大的 populate,可以让你在别的 collection...Populate 可以自动替换 document 中的指定字段,替换内容从其他 collection 获取,我们填充(populate)单个或者多个 document、单个或者多个对象,甚至是 query...populate('author')....它允许你在相同的底层MongoDb collection上使用部分重叠的 schema 建立多个 model。
前言 再好的东西不使用它,他终究不属于你,只有我们真正的把它运用到实际,真正的理解它,才能发挥它的最大作用正所谓实践出真理。...准备工作 项目中我们用到的是基于node的express[1] 框架 npm i express-generator -g express-generator是一个express的应用生成器,可以快速的创建一个...数据库 安装 npm i mongoose -S 完成安装之后我们需要在app.js里引入并且配置数据库 //app.js //引入数据库 const mongoose = require('mongoose...const mongoose = require("mongoose"); const Scheme = mongoose.Schema; const ObjectId = mongoose.Types.ObjectId...= require("mongoose"); const model = mongoose.model.bind(mongoose); const scheme = require("..
准备工作 let mongoose = require("mongoose"); let connection = require("..../connection"); 首先我们需要启动数据库,然后把mongoose库和connection引入,为我们连接数据库做准备。..._id,grade:100}); console.log(score); })() image.png 我们在上面的准备工作里创建了一个UserScheme集合结构,在这里我们又创建ScoreSchema...使用了一个ref的类型是引用的User模型 (async function(scoreId){ let score = await Score.findById(scoreId).populate...('uid'); console.log(score); })("5f22712e78f5d73c7cae4b2f") image.png 上图使用了populate是填充的意思 就是把一个外键字段
初始化一条数据 如果对mongodb,mongoose没有基础的了解,建议看一看mongoose深入浅出 ,mongoose基础操作 // controllers/student.js const.../model/student'); var mongoose = require('mongoose'); var Schema = mongoose.Schema; var student = new...mongodb本来就是非关系型的数据库,但是有很多时候不同的集合直接是需要关联的,这是就用到了mongoose提供的populate 直接看图,不同集合直接的关联,用的就是_id,比如下图中,学生参加的考试...怎么才能让试卷、教师、问题关联起来啊,ref存的是_id,然而这些新增的数据,是保存之后才有_id的。..._id); // 教师中添加该试卷的_id doc.save(); // 很重要 不save则没有数据 // 第三步
// mongoose.Schema() 是一个构造函数,要new一个实例对象 //2、设定集合规则 const courseSchema = new mongoose.Schema({ name...({ title: { type: String, // 必传字段,不传就会报错 required: [true, '请传入文章标题'], ...使用id对集合进行关联 使用populate方法进行关联集合查询 ?...// 关联集合 const mongoose = require('mongoose'); // 连接数据库 mongoose.connect('mongodb://localhost/playground...5f9668bb20347221d49d0254' // }).then((result => { // console.log(result); // })); // 2、联合查询 Post.find().populate
它的意义是:适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。...而非关系型数据库以键值对 (key-value) 存储,它的结构不固定,每一条记录可以有不一样的键,每条记录可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。...下载地址 4 Koa + Mongodb 操作 4.1 安装链接 npm i mongoose -Sconst mongoose = require('mongoose') // 默认 27017 端口...ctx.status = 204 }使用put方法注册路由router.put('/following/:my_id/:id', follow)使用 postman 请求后拉取列表 如果想获取关注者的详细信息使用 populate...await User.find({ name: new RegExp(q) // 模糊搜索 }).limit(limit).skip(page * limit).select(selectFields).populate
全部接口文档包括:http://localhost:7001/swagger-doc 有了它,可以很方便地在注释创建接口,不需要再创建路由了!...app.emit('error', err, this) const status = err.status || 500 // 生产环境时 500 错误的详细错误内容不返回给客户端...它的作用在于我们可以将一些常用的动作抽离在 helper.js 里面成为一个独立的函数,这样可以用 JavaScript 来写复杂的逻辑,避免逻辑分散各处。...= app.mongoose const UserSchema = new mongoose.Schema({ mobile: { type: String, unique: true, required...框架提供了统一的入口文件( app.js)进行启动过程自定义,这个文件返回一个 Boot 类,我们可以通过定义 Boot 类中的生命周期方法来执行启动应用过程中的初始化工作。
早已久仰NoSQL的大名,知道它相对有关系型数据库,有很多的优点,只是一直没有时间来研究这个东西。所以借这个项目,对Mongodb进行了一次深入了解。...项目中的Mongodb设计 NodeJS的流行,离不开丰富的中间件支持,对于操作Mongoose的中间件,我推荐“mongoosejs”, 官网称之为:“Mongoose ODM”。...先学习以下Mongoose的基本用法 将Mongoose集成到项目中 npm install --save mongoose 连接数据库 var mongoose = require('mongoose..._user.username是出不来数据的,原因就是我们需要用到populate()函数。...var article = Article.findById(id, callback).populate('_user'); 这样article._user.username就有数据了。
1.创建集合 创建集合分为两步,-是对对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。...// mongoose.Schema() 是一个构造函数,要new一个实例对象 //2、设定集合规则 const courseSchema = new mongoose.Schema({ name...({ title: { type: String, // 必传字段,不传就会报错 required: [true, '请传入文章标题'],...使用id对集合进行关联 使用populate方法进行关联集合查询 // 关联集合 const mongoose = require('mongoose'); // 连接数据库 mongoose.connect...5f9668bb20347221d49d0254' // }).then((result => { // console.log(result); // })); // 2、联合查询 Post.find().populate
因为使用的局限性不是Linux的我,第一步apt install linux-tools-common都安不上,如果还要跑在虚拟机什么的上面是不是太麻烦了,方案一卒。...出来的各种方案在我一一踩坑后全部以失败告终,其实也还有一些更简单的方案,例如直接接入alinode用阿里云的平台就好,一方面该项目没有接入阿里云,刚好用的node镜像又不是ali的,另一方面,如果可以在开发环境查出问题,不希望再通过上线去查问题...从completeMany这里破案了,这是mongoose中的一个方法,作用是将查询到的结果进行包装,使结果中的每一个文档成为mongoose文档,使之可以继续使用mongoose提供的方法。...options.populate) { // 看这里 重点重点! return !!options.lean === true ?...__noPromise = true; _this.model.populate(docs, pop, function(err, docs) { if (err) return callback
CORS 是用来限制此域名下的资源访问解决方案,当它关闭时,另外一个域名访问此域名的资源时会被拒绝。...const mongoose = require('mongoose'); const Schema = mongoose.Schema; const model = mongoose.model.bind...最后是我们的 product Controller ,它内部的操作和我们上面讲到的 manufacturer Controller 基本一致。 const Model = require('.....const { Product } = Model; const productController = { all(req, res) { Product.find({}) .populate..._id }) .populate('manufacturer') .exec((err, product) => res.json(product)) })
具体如下: Representational: 数据的表现形式(JSON、XML...) state: 当前状态或者数据 transfer: 数据传输 它描述了一个系统如何与另一个交流。...主要存放在服务器,相对安全 cookie:主要存放在客户端,并且不是很安全 sessionStorage:仅在当前会话下有效,关闭页面或浏览器后被清除 localstorage:除非被清除,否则永久保存 工作原理...这两者的组合没什么问题,不过 koa-multer 和 koa-route(注意不是 koa-router) 存在不兼容的问题。...安装 mongoose npm install mongoose -S 连接及配置 const mongoose = require("mongoose"); mongoose.connect(....join(" "); const user = await User.findById(ctx.params.id) .select(selectFields) .populate
简介 今天我们将学习Mongoose,什么是Mongoose呢,它于MongoDB又是什么关系呢,它可以用来做什么呢,介绍Mongoose之前,我们先简单了解一下MongoDB。...MongoDB是一个开源的NoSQL数据库,相比MySQL那样的关系型数据库,它更显得轻巧、灵活,非常适合在数据规模很大、事务性不强的场合下使用。...同时它也是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储(文档,就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档...MongoDB —— 是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以Document(以下简称文档)的形式存储(Document,就是一个关联数组式的对象,它的内部由属性组成,...创建集合 基于前面的内容,接下来我们就开始学习对数据的具体操作了,下面是关于一些基础数据的定义,相信对于你来说已经不陌生了,请在仔细温习一遍吧!
下载 npm i mongoose -s 连接数据库 const mongoose = require("mongoose"); mongoose.connect(dbURL); const db =...mongoose.connection; db.on("error", () => { console.log("链接失败"); }); db.on("open", () => {...会自己添加一个该字段,该字段不会重复,类型为ObjectId,通过findById()查询 const userSachem = new mongoose.Schema( { name...默认没有可以不写 }, { timestamps: true, //!...} res.status(200).json({ doc1, doc2, doc3 }); } ); 通过Model.insertMany方法 该方法与create的区别是它接收的第一个参数是数据组成的数组
编码前的准备工作 首先要安装好NodeJs运行环境,配置好node和npm的环境变量,最好安装淘宝 NPM 镜像cnpm,安装配置好npm后,打开终端运行npm install -g cnpm --registry...,简单易用,下面的代码演示了如何使用Express在指定的4001端口上监听,开启一个http服务,当然端口可以随意指定,只要和系统中其他不冲突即可,感觉使用起来比Java SpringBoot简单不少...mongoose') mongoose.connect('mongodb://localhost:27017/express-test', { useNewUrlParser: true,...req,res){ const product = await Product.findById(req.params.id); // 将客户端传过来的title赋值给产品(赋值不需要异步,因为它只是...req,res){ const product = await Product.findById(req.params.id); // 将客户端传过来的title赋值给产品(赋值不需要异步,因为它只是
言归正传,Node.js是一个运行在服务端的框架,它底层使用的是V8引擎,它的速度非常快,并且作为一个前端的后端服务语言,还有其他吸引人的地方: 异步I/O 事件驱动 单线程 跨平台 而且,最最最最重要的一点就是...上面两张图很清晰的展示了洋葱模型的工作流程,当然,具体的原理实现的话与本篇无关,就不在深入描述了,有兴趣的同学可以自己到网上搜一下哈。...不过这个项目除了使用mysql,也还有用到mongo,接下来看看mongodb怎么用 使用mongoose作为mongodb的中间件 // mongoose入口 import mongoose from...) => { log('Mongoose connection disconnected') }) export default mongoose // 定义表模型 import mongoose...// ... } } // ... } export default new AccLogRoute() 说到这边,不得不提一句哈,就是路由可以引入装饰器写法,这样能减少重复工作和提高效率
领取专属 10元无门槛券
手把手带您无忧上云