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

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

本文源自工作中的一个问题,在使用 Mongoose 做关联查询时发现使用 populate() 方法不能直接关联非 _id 之外的其它字段,在网上搜索时这块的解决方案也并不是很多,在经过一番查阅、测试之后...Virtual 和 populate 实现 Mongoose 的 populate 方法默认情况下是指向的要关联的集合的 _id 字段,并且在 populate 方法里无法更改的,但是在 Mongoose...' }); })(); Mongoose 的虚拟值填充,还可以对匹配的文档数量进行计数,使用如下: // model/author.js AuthorSchema.virtual('bookListCount...关联查询时如何关联一个非 _id 字段,一种方式是直接使用 MongoDB 原生提供的 Aggregate 聚合管道的 lookup 阶段来实现,这种方式使用起来灵活,可操作的空间更大,例如通过 as...另外一种是 Mongoose 提供的 populate 方法,这种方式写起来,代码会更简洁些,这里需要注意如果关联的字段是非 _id 字段,一定要在 Schema 中设置虚拟值填充,否则 populate

26.4K20

你真的了解mongoose吗?

如果值是一个函数,函数的返回值用作默认值。 select: 布尔值 指定 query 的默认 projections validate: 函数,对属性添加验证函数。...如果出错, error 是出错信息,result 是 null;如果查询成功, error 是 null, result 是查询结果,查询结果的结构形式是根据查询方法的不同而有不同形式的。...sort:如果查询条件找到多个文档,设置排序顺序以选择要更新哪个文档。 maxTimeMS:为查询设置时间限制。 upsert:布尔值,如果对象不存在,创建它。默认值为 false。...omitUndefined:布尔值,如果为 true,则在更新之前删除值为 undefined 的属性。 rawResult:如果为 true,返回来自 MongoDB 的原生结果。...rawResult:如果为 true,返回来自 MongoDB 的原生结果。 callback 没有符合 filter 的数据时,返回 null。 filter 为空或 {} 时,删除第一条数据。

41.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

MongoDB数据库基本操作

('User', userSchema); // 查询用户集合中的所有文档 User.find().then(result => console.log(result)); // 通过_id字段查找文档...分页可以用到) // User.find().skip(2).limit(3).then(result => console.log(result)) 删除文档 findOneAndDelete 单个 如果更新条件匹配多个默认只更新第一个...('User', userSchema); // 查找到一条文档并且删除 // 返回删除的文档 // 如何查询条件匹配了多个文档 那么将会删除第一个匹配的文档 // User.findOneAndDelete....then(result => console.log(result)) 更新修改文档 updateOne 单个 如果更新条件匹配多个默认只更新第一个 updateMany 多个 第一个条件为空 默认更新所有...('User', userSchema); // 找到要删除的文档并且删除 // 返回是否删除成功的对象 // 如果匹配了多条文档, 只会删除匹配成功的第一条文档 // User.updateOne({

4.2K10

MongoDB增删改查操作

1.4 查询文档 // 根据条件查找文档(条件为空查找所有文档) Course.find().then(result => console.log(result)) ?...1.5 删除文档 删除单个文档 查找到一条文档并且删除 返回删除的文档 如何查询条件匹配了多个文档那么将会删除第一个匹配的文档 User.findOneAndDelete({_id: '5c09f1e5aeb04b22f8460965...删除多个文档 如果没有给出删除的文档 那么将删除所有文档 User.deleteMany({}).then(result => console.log(result)); ?...mongoose验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败就输入插入失败。...使用ID将文章集合和作者集合进行关联 author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } })); //联合查询 Post.find

19.8K30

mongoose官方文档总结

删除 model的remove方法可以删除所有匹配查询条件(condition)的文档 Tank.remove({size:small},function(err){ if(err) return...如果想更新单独一条文档并且返回给应用层,可以使用 findOneAndUpdate 方法。 六、文档-Documents Mongoose document代表着MongoDB文档的一对一映射。..._id); }) 异步 Post 钩子 如果你给 post 钩子的回调函数传入两个参数,mongoose 会认为第二个参数是 next()函数,可以通过 next 触发下一个中间件 schema.post...Person.create([{name:'liu'},{name:'Gezhou'}]); 十、填充–Populate demo MongoDb 在 3.2之后,也有像 sql 中的 join 聚合操作...= require('mongoose') const Schema = mongoose.Schema; const personSchema = Schema({ _id:Schema.types.ObjectId

20.6K40

MongDB删除文档和更新文档

第三方模块 用来操作数据库 const mongoose = require('mongoose'); // 数据库连接 mongoose.connect('mongodb://localhost/playground...('User', userSchema); // 查找到一条文档并且删除 // 返回删除的文档 // 如何查询条件匹配了多个文档 那么将会删除第一个匹配的文档 // User.findOneAndDelete...({_id: '5c09f267aeb04b22f8460968'}).then(result => console.log(result)) // 删除多条文档 // {} 即删除所有文档 User.deleteMany...第三方模块 用来操作数据库 const mongoose = require('mongoose'); // 数据库连接 mongoose.connect('mongodb://localhost/playground...('User', userSchema); // 找到要删除的文档并且删除 // 返回是否删除成功的对象 // 如果匹配了多条文档, 只会删除匹配成功的第一条文档 // User.updateOne({

2.9K10

Nodejs学习笔记(十四)— Mongoose介绍和入门

常用方法还有findByIdAndUpdate,这种比较有指定性,就是根据_id   Model.findByIdAndUpdate(id, [update], [options], [callback...(基于LBS)   $exists    字段是否存在   $elemMatch  匹配内数组内的元素   $within  范围查询(基于LBS)   $box    范围查询,矩形范围(基于LBS)...根据_id查询   Model.findById(id, [fields], [options], [callback]) var User = require("..../user.js"); function getById(){ var id = '56f261fb448779caa359cb73'; User.findById(id,...mongoose操作基本入门大致就是这些,自已试一下,入门完全没问题,并且比node-mongodb-native还是要简单明了一些,   在node.js中操作数据库,如果逻辑相对复杂时,大量的回调嵌套还是比较郁闷的

2.6K60

Node.js基于Express框架搭建一个简单的注册登录Web功能

这个小应用使用到了node.js  bootstrap  express  以及数据库的操作 :使用mongoose对象模型来操作 mongodb 如果没了解过的可以先去基本了解一下相关概念~ 首先注明一下版本...出现如上图所示,看到install dependencies没有,它说如果你想安装依赖就先进入项目test目录,然后执行 npm install安装依赖模块。...在home这里还提供了注销的功能(无页面文件,它的路径为 /logout 如果浏览器直接输入localhost:3000/home  要先判断是否登录成功,未登录不允许进入 看到上诉,应该了解到:我们是通过一个路径...比如定义一个Schema: var mongoose = require("mongoose"); var TestSchema = new mongoose.Schema({ name :...= doc.password){ //查询到匹配用户名的信息,但相应的password属性不匹配 req.session.error = "密码错误";

7.2K10

Mongoose学习参考文档

Model和Entity都有能影响数据库的操作,但仍有区别,后面我们也会做解释 二、新手指引 如果您还不清楚Mongoose是如何工作的,请参看第一章快速通道快速浏览他的用法吧 1....,{capped:{size:1024,max:100,autoIndexId:true}}); 2.5.5 versionKey——版本锁   版本锁是Mongoose默认配置(__v属性)的,如果你想自己定制...当然这样的更新很麻烦,可以使用$set属性来配置,这样也不用先查询,如果更新的数据比较少,可用性还是很好的: PersonModel.update({_id:_id},{$set:{name:'...err==null,person就能取到数据 });   这种方式相对直接查询,分的比较明细,如果不带callback,返回query,query没有执行的预编译查询语句,该query对象执行的方法都将返回自己...也将无法保存 验证并不关心错误类型,而通过ValidationError这个对象可以访问 7.1 验证器 required 非空验证 min/max 范围验证(边值验证) enum/match 枚举验证/匹配验证

24.2K90
领券