nodejs操作 mongoose(mongodb)和Sequelize(mysql)查询数据后添加新属性未生效
最近在着手koa时候,发现mongoose(mongodb)查询数据库后添加新属性,前端拿不到新属性问题,
然后测试了一下Sequelize(mysql),发现也有同样的问题存在。此时着手干!
1.1 mongoose问题展示:
router.get('/order_show', async (ctx, next) => {
const id = ctx.query.id
try {
let doc = await Order.findOne({ _id: id }).populate(['buyid', 'address'])
doc.goods.forEach(async (item, index) => {
const goodsdata = await Goods.findOne({ id: item.id })
doc.goods[index].list = goodsdata
})
if (!doc) {
await ctx.render('order/order_show', { orderInfo: null })
return false
}
await ctx.render('order/order_show', { orderInfo: doc })
} catch (err) {
console.log(err)
await ctx.render('order/order_show', { orderInfo: null })
}
})
问题:以上案例,获取订单详情信息,要查询出订单详情里面每条商品的数据,先查询出来该订单的数据,然后循环订单数据里面商品数组,再根据数组去根据每一个id去获取对应的商品数据。
获取到商品数据后,这时候就想追加到原来获取到的商品数组里面的每一项的list属性里面,但时候这时候发现,直接设置并没有效果哦!
很诡异吧,但是经过查询了mongoose文档之后,才发现原来mongoose查询出来的数据发现访问以上域名的时候,前台模板并没有list这个属性。
经过查询mongoose 文档,知道mongoose查询出来的对象是document对象,并不是普通的javascript对象,所以设置list属性并未生效。
1.2 mongoose(mongodb)解决方法:
将document对象转换为普通的javascript对象,我们可以使用mongoose的Document.prototype.toObject()方法进项转换。修改代码如下:
经过先把document对象转换为普通javascript对象之后,我们就可以使用js object的方法去设置新属了。
router.get('/order_show', async (ctx, next) => {
const id = ctx.query.id
try {
let doc = await Order.findOne({ _id: id }).populate(['buyid', 'address'])
doc = doc.toObject() // 修改这里就可以,将doc转换为Object对象
doc.goods.forEach(async (item, index) => {
const goodsdata = await Goods.findOne({ id: item.id })
doc.goods[index].list = goodsdata
})
if (!doc) {
await ctx.render('order/order_show', { orderInfo: null })
return false
}
await ctx.render('order/order_show', { orderInfo: doc })
} catch (err) {
console.log(err)
await ctx.render('order/order_show', { orderInfo: null })
}
})
测试了mongoose 操作mongodb的问题之后,接着我就试了mysql的工具 Sequelize的,设置新属性,并没有效果。
2.1 Sequelize问题展示:
for (let i = 0; i < goods.length; i++) {
let brandInfo = await Brand.findById(goods[i].brand_id)
goods[i].brandInfo = brandInfo
}
问题:以上案例,user_info这个属性并没有添加上去。
去查询了Sequelize的文档,查询到这个方法可以去操作查询出来的数据结构变化:
setDataValue(key, value)
2.2 Sequelize(mysql)解决方法:
for (let i = 0; i < goods.length; i++) {
let brandInfo = await Brand.findById(goods[i].brand_id)
goods[i].setDataValue( 'brandInfo', brandInfo )
}
nodejs操作 mongoose(mongodb)和Sequelize(mysql)查询数据后添加新属性未生效的更多相关文章
- Mysql删除数据后磁盘空间未释放的解决办法【转】
转自 Mysql删除数据后,磁盘空间未释放的解决办法 - 今日头条(TouTiao.com)http://toutiao.com/a6303087712678412546/?tt_from=mobil ...
- MySQL查询数据表中数据记录(包括多表查询)
MySQL查询数据表中数据记录(包括多表查询) 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: sele ...
- mysql 查询数据时按照A-Z顺序排序返回结果集
mysql 查询数据时按照A-Z顺序排序返回结果集 $sql = "SELECT * , ELT( INTERVAL( CONV( HEX( left( name, 1 ) ) , 16, ...
- MySQL 查询数据
MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MyS ...
- 十二、MySQL 查询数据
MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MyS ...
- navicat for Mysql查询数据不能直接修改
navicat for Mysql查询数据不能直接修改 原来的sql语句: <pre> select id,name,title from table where id = 5;</ ...
- 使用Python3导出MySQL查询数据
整理个Python3导出MySQL查询数据d的脚本. Python依赖包: pymysql xlwt Python脚本: #!/usr/bin/env python # -*- coding: utf ...
- 关于mysql 删除数据后物理空间未释放(转载)
转自 关于mysql 删除数据后物理空间未释放(转载) - NETDATA - 博客园http://www.cnblogs.com/shawnloong/archive/2013/02/07/2908 ...
- MySQL删除数据后磁盘空间的释放情况【转】
OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除 ...
随机推荐
- jdbc之工具类DBUtil的使用
首先回顾一下jdbc的使用方法: 1. 注册驱动 2. 建立连接 3. 建立statement 4. 定义sql语句 5. 执行sql语句,如果执行的是查询需遍历结果集 6. 关闭连接 其中建立连接和 ...
- 转载-《Python学习手册》读书笔记
转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html
- 使用Jmeter连接MySql数据库
准备条件: 1.在MySql中创建数据库和表 2.MySql的驱动jra包 操作步骤: 1.将MySql的驱动jra包放入Jmetre本地文件夹的lib目录下 2.新建一个线程组,在线程组上 添加-配 ...
- Hadoop-Impala学习笔记之入门
CDH quickstart vm包含了单节点的全套hadoop服务生态,可从https://www.cloudera.com/downloads/quickstart_vms/5-13.html下载 ...
- Selenium及Headless Chrome抓取动态HTML页面
一般的的静态HTML页面可以使用requests等库直接抓取,但还有一部分比较复杂的动态页面,这些页面的DOM是动态生成的,有些还需要用户与其点击互动,这些页面只能使用真实的浏览器引擎动态解析,Sel ...
- MongoDB --- 01. 安装, 第三方客户端
一.安装 1.选择默认安装 ①完成后进入目录查看 "C:\Program Files\MongoDB\Server\3.4\bin" ② 配置环境变量 ③ 在 c盘创建目录(数据库 ...
- 记python使用grpc
using grpc in Python gRPC是基于http/2的RPC框架,使用ProtoBuf作为底层数据序列化.Nginx服务器2018年3月17日引入gRPC支持. gRPC 是用来实现跨 ...
- P2178 [NOI2015]品酒大会
思路 在后缀树上进行一些操作就好了 后缀树上LCA的maxlen就是两个后缀的LCP的长度了 然后统计每个点作为LCA的次数和最大值.次大值.最小值.次小值 然后就做完了 代码 #include &l ...
- vue--vant组件库field输入框
安装vant UI框架: cnpm install vant –-save-dev 导入组件-在main.js里: import Vant from 'vant'; import'vant/lib/v ...
- 爬坑之路---Google map
google.maps.event.adddDomListen(window, 'load', callback);当文档流中所有的dom加载完成后,执行回调函数,可以不用在script中使用defe ...