MongoDB在3.2以上的版本有类似于 join 的 $lookup 聚合操作符,其实 Mongoose 有一个更强大的替代方法,叫做populate ( ),它允许你在其他集合中引用文档,实现更简洁优雅的查询操作...定义文章的 schema 生成模型导出,文件名 article.js 通过给 schema 中的关联字段添加 ref 与指定的模型建立关联 // 引入自定义的数据库连接文件 var mongoose =...执行查询操作 // 注意使用 populate 需要引入用到的 model var ArticleCateModel=require('....(docs); }) // 文章表、分类表、用户表关联 ArticleModel.find({}).populate('cid').populate('author_id').exec(function...(err,docs){ console.log(docs); }) 通过给 populate 中传入所关联的字段与指定的集合进行关联查询,在 exec( ) 的回调方法中获取查询的结果。
本文源自工作中的一个问题,在使用 Mongoose 做关联查询时发现使用 populate() 方法不能直接关联非 _id 之外的其它字段,在网上搜索时这块的解决方案也并不是很多,在经过一番查阅、测试之后...,有两种可行的方案,使用 Mongoose 的 virtual 结合 populate 和 MongoDB 原生提供的 Aggregate 里面的 $lookup 阶段来实现。...图片来源:mongoing[1] 引用模型示例 JSON 模型 我们通过作者和书籍的关系,一个作者对应多个书籍这样一个简单的示例来学习如何在 MongoDB 中实现关联非 _id 查询。...Virtual 和 populate 实现 Mongoose 的 populate 方法默认情况下是指向的要关联的集合的 _id 字段,并且在 populate 方法里无法更改的,但是在 Mongoose...另外一种是 Mongoose 提供的 populate 方法,这种方式写起来,代码会更简洁些,这里需要注意如果关联的字段是非 _id 字段,一定要在 Schema 中设置虚拟值填充,否则 populate
这个工具的populate静态方法可以直接将map对象封装成实体类,简化代码编写,这里做一下记录。...1.8.0.jar //import org.apache.commons.beanutils.BeanUtils; //作用是直接将map转换为一个类的对象 BeanUtils.populate
下面小编就为大家介绍一下如何在Mac上使用Split View功能 。无论您是想更有效地完成某些工作还是浏览网页时更轻松地执行多任务,在Split View中构建的macOS都是一项非常有用的功能。...在Mac上如何使用分屏: 1.单击并按住窗口左上角的全屏按钮。 2.当您看到屏幕的一半变成蓝色时,将窗口拖到左侧或右侧,然后松开应用程序 3.选择您要填写屏幕另一半的第二个窗口,单击它。...5.您会注意到,在Split View中使用的第二个应用程序仍将处于全屏模式,也按照相同的步骤将该窗口返回到之前的大小。...如果您想使用一个已经全屏的应用程序和一个不是全屏的应用程序,请调用Mission Control并在顶部的全屏应用程序缩略图上拖动第二个应用程序。...小编觉得在Mac上使用Split View分屏功能真得很方便,你们觉得呢?
“白盒”池通常以相应的业务流程(如“需求管理流程”、“帮助台流程”或“服务交付流程”)命名,而“黑盒”池通常以相应的组织、人员或系统(如“供应商”)命名,“客户”或“内容管理系统”)。...“池之间”通信时只能使用消息流。消息流表示两个池或流程之间的消息交换,包括它们的同步。可以按照图3中的定义使用消息流: 请注意,在这两种情况下,只允许元素之间的连接,如前两幅图所示。...这意味着池中的所有流元素都应该使用图2和图3中定义的序列流进行连接。 错误2:序列流的错误使用 问题。建模多个池时的另一个常见问题是,建模者可能会将一组池视为具有多个通道的单个池。...在这种情况下,建模者使用池之间的序列流。最终结果将是一个不正确的模型(参见图2),该模型散布在池的边界上。 解决方案。此问题最常见的解决方案是在单个模型中使用泳道交换池,如下所示。...这个问题最常见的解决方案与前一个类似;在两个流程中定义一个(如图9所示)。这意味着冗余的开始和结束事件将从模型中删除。如果实际需要多个池(存在多个独立流程),则应使用错误1的解决方案。
官方示例 其他 当前的实现全部都是基于 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...('list').then((res) => { // 然后使用 populate 来获取引用的数据 console.log(res); }), 其他 其实不一定要使用 ObjectID 类型来引用...使用 populate() 之前应该返回一个 ID, 使用 populate() 之后应该返回一个 Object
评论应该是在整个博客数据存储中,模型最为复杂的一部分了。首先要考虑的是和文章进行关联。这个可以用 mongoDB 的 ref 进行关联,随后可以使用 populate 计算出被关联的字段。...post列中关联引用表(post表)的 _id(文章),在 hasChild 中记录是否存在回复。...如 post 中的一篇 pid 为 11 的文章下有一条评论,那么 key 中命名 11#001,这是第一条评论,如果该评论下存在一条回复,则回复的 key 为 11#001#001,下层亦是如此。...' }) 33} 34} 35return res.send({ ok: 0, msg: '请输入正确的ID' }) 36}) COPY 说完了删除,相比之下新建评论就容易多了,只要根据原本的评论数量设定新的...可以使用模型提供的方法 countDocument()。
有这样两张表 addon_passwordbox_category 'use strict' var mongoose = require('mongoose'), Schema = mongoose.Schema...Schema.Types.ObjectId, ref: 'addon_passwordbox_category'}, // addon-passwordbox-category表中对应的类别的...Schema({ email: String, // addon-passwordbox-list表中的_id name: String, /...('addon_passwordbox_category', addon_passwordbox_category) addon_passwordbox_list 二张表使用catId作为主键关联 现在查...addon_passwordbox_list 表时要自动带出关联的addon_passwordbox_category表的数据 使用 populate() 代码如下: findAllByCondition
console.log(err[attr]['message']); } }) 6、集合关联及实现 通常不同集合的数据之间是有关系的,例如文章信息和用户信息存储在不同集合中,...使用id对集合进行关联 使用populate方法进行关联集合查询 集合关联实现 // 用户集合 const User = mongoose.model('User', new mongoose.Schema...title: { type: String }, // 使用ID将文章集合和作者集合进行关联 author: { type: mongoose.Schema.Types.ObjectId..., ref: 'User' } })); //联合查询 Post.find() .populate('author') .then((err, result) => console.log...titile: '123', author: '5c0caae2c4e4081c28439791'}).then(result => console.log(result)); Post.find().populate
两个Schema: User:用户 Article:文章 其中一个用户可以包含多个文章 使用mongoose 在关系型数据库中,我们通常将这两个对象设计成一对多的关系,一个User对应多个Article...而使用mongoose我们可以如此设计: User: { username: {type: String, required: true, unique: true},// 用户名 password...default: Date.now}, _user: { type: Schema.Types.ObjectId, ref: 'User' } } Article中的..._user字段是关键,使用ref,将其与User关联,那么使用mongoose查询Article时(populate方法),就会将其关联的User一并查出。..._user.username); }) 关键字: populate
在本教程中,您将学习如何在Linux Web服务器上托管的Laravel应用程序上正确配置文件权限。 首先,确定运行Web服务器的用户名。...以下是一些默认情况 Linux上的Nginx使用帐户 - www-data Debian系统上的Apache使用account-www-data RedHat系统上的Apache使用帐户 - apache...我们假设我们的Web服务器使用帐户www-data运行。
看完Models,最后让我们来看下在实战中比较有用的Populate 联表(Populate) Mongoose 的 populate() 可以连表查询,即在另外的集合中引用其文档。...Populate() 可以自动替换 document 中的指定字段,替换内容从其他 collection 中获取。...ref 选项告诉 Mongoose 在使用 populate() 填充的时候使用哪个 Model。...ref 选项告诉 Mongoose 在填充的时候使用 User model。所有储存在 answerer 中的 _id 都必须是 User model 中 document 的 _id。...(populateStr); 最后 到这里本篇文章也就结束了,这里主要是结合我平时的项目(https://github.com/Jack-cool/rest_node_api)中对于mongoose的使用做的简单的总结
使用 Mongoose 简单的建立一个博客数据库以及模型之间的关联。...categories: [ // 分类与分类模型相关联 6 { 7 type: mongoose.SchemaTypes.ObjectId, // 关联分类模型中的唯一 _id...populate()可以跟踪关联的_id,输出详细的内容。...name: 'vuejs', __v: 0 } ], 11 _id: 5d3061bb5617a5750523af66, 12 title: '第2篇帖子', 13 __v: 22 14} COPY 使用分类模型反查文章...因为分类模型中不存在对 Post 的记录所以查询的时候要建立虚拟字段。
直接上代码: var mongoose = require('mongoose'); var Schema = mongoose.Schema; var async = require('async')...; var pageQuery = function (page, pageSize, Model, populate, queryParams, sortParams, callback) {...records: function (done) { // 查询一页的记录 Model.find(queryParams).skip(start).limit(pageSize).populate...(populate).sort(sortParams).exec(function (err, doc) { done(err, doc); })...results.records; callback(err, $page); }); }; module.exports = { pageQuery: pageQuery }; 使用方法
深入浅出mongodb(一)和深入浅出mongodb(二)两篇文章讲述了一些安装和使用的基础知识,这篇文章小编将带你走进实战世界,真正体会项目中是怎么使用mongodb开发,让我们一起揭开它神秘的面纱。...useUnifiedTopology: true }); 设置跨域 在开发中,我们采用的都是前后端分离的状态,在本地的开发环境中我们无法避免的会遇到跨域[3]的情况,我们这里设置允许所有的源访问 app.use...实际上在真正的开发环境中,如果我们这么设置允许所有的的源都可以访问会有很多问题,我们可以使用cors[4]来代替它 当然如果在生产中我们采用nginx部署之后,就不存在跨域了?...const mongoose = require("mongoose"); const Scheme = mongoose.Schema; const ObjectId = mongoose.Types.ObjectId...router.delete('/goose/:id', gooseController.remove); module.exports = router 成果 我们完成上面的步骤之后,我们需要自测试一下接口和逻辑是否正确
通过查找资料我的总结如下: 如果只需要通过A集合查询B集合,而不需要反过来查询,也就是单向的关系(如文章和评论,只需要展示文章的时候,将其评论展示即可),那么可以在A集合中建立一个子集合B。...如果既需要通过A查询B,又需要通过B查询A(如作者和文章,需要查询某作者下的所有文章,展示文章的时候,有需要展示作者的相关信息),那么可以在子集合中通过一个唯一字段关联父集合。..._user.username是出不来数据的,原因就是我们需要用到populate()函数。...var article = Article.findById(id, callback).populate('_user'); 这样article._user.username就有数据了。...以前使用Hibernate,默认是没有这个功能的,要想实现需要通过@PrePersist注解和@PreUpdate注解来手动定义好,很是麻烦。
下载与原始文件同名的文件的常用语法非常简单: curl -O URL_of_the_file 这在大多数情况下都有效,但是,您会注意到,有时当您从 GitHub 或 SourceForge 下载文件时,它不会获取正确的文件...如果我在浏览器中打开这个源代码链接,它会得到 .tar.gz 格式的源代码。 但是,如果我使用终端使用 curl 命令下载相同的文件,我会得到一个不正确存档格式的小文件。...使用 curl 正确下载存档文件 这里的问题是您拥有的 URL 重定向到实际的存档文件。为此,您需要使用其他选项。 curl -JLO URL_of_the_file 选项可以按任何顺序排列。...J:此选项告诉 -O, --remote-name 选项使用服务器指定的 Content-Disposition 文件名,而不是从 URL 中提取文件名。...O:使用此选项,您无需指定下载的输出文件名。 正如您在下面的屏幕截图中所见,这次我能够使用 curl -JLO 选项下载正确的文件。
这种行为适用于大多数循环(比如while和for-of循环)… 但是它不能处理需要回调的循环,如forEach、map、filter和reduce。...在接下来的几节中,我们将研究await 如何影响forEach、map和filter。 在 forEach 循环中使用 await 首先,使用 forEach 对数组进行遍历。...当在filter 回调中使用await时,回调总是一个promise。由于promise 总是真的,数组中的所有项都通过filter 。...在filter 使用 await类以下这段代码 const filtered = array.filter(true); 在filter使用 await 正确的三个步骤 使用map返回一个promise...在 reduce 循环中使用 await 如果想要计算 fruitBastet中的水果总数。 通常,你可以使用reduce循环遍历数组并将数字相加。
(作者授权转载) 地址:https://mp.weixin.qq.com/s/Pb51aYdrxAALM_wR4asDgg 日志,是开发者排查问题的非常重要的手段,有时候甚至是唯一的,所以如何合理并正确的打印日志...Node.js 中打日志的方式,一般有几种: 1、主动展示 2、被动记录 这两种方式都可以由不同的模块来实现,我们接下去就来看看怎么选择。...$ DEBUG=* node app.js 由于 debug 模块由 TJ 出品,并且在非常早的时候就投入,使用过于广泛,至今仍有非常多的模块使用了它。...在文本结构的输出中,这些字段将被空格(space)分隔,以换行符作为结尾(\n),这样可以方便外部的日志采集系统采集,比如阿里云的 SLS 等等。...正确的打日志 在了解了基本的日志库和体系之后,我们来具体看一看真正打日志的问题。
MongoDB,默认端口27017 操作缓存 就是说不必等待上面的connect连接成功后,就可以使用创建的 Mongoose models 禁用缓存,要修改 bufferCommands配置,mongoose.set...在Mongoose中,意味着你可以在里嵌套另一个schema。...demo MongoDb 在 3.2之后,也有像 sql 中的 join 聚合操作,那就死$lookup,而 mongoose 拥有更强大的 populate,可以让你在别的 collection...Populate 可以自动替换 document 中的指定字段,替换内容从其他 collection 获取,我们填充(populate)单个或者多个 document、单个或者多个对象,甚至是 query...populate('author').
领取专属 10元无门槛券
手把手带您无忧上云