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 是指对表进行优化.如果已经删除 ...
随机推荐
- ACTIVEMQ 实例化到MSSQL
实例化文章很多,不重复,自行查询 直接上XML <!-- Licensed to the Apache Software Foundation (ASF) under one or more c ...
- Flutter 输入控件TextField设置内容并保持光标(cursor)在末尾
TextField( controller: TextEditingController.fromValue(TextEditingValue( // 设置内容 text: inputText, // ...
- svg---基础1
svg:可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网制定,是一个开放标准. 官网:http://www.w3.org/2000/svg ...
- range 小数据池介绍
1.range 2.小数据池 1. range 范围 [起始位置:终止位置:步长]range(起始位置,终止位置,步长) #顾头不顾尾 3.小数据池 小数据池,也称为小整数缓存机制,或者称为驻留机制等 ...
- web性能测试
在公司Confluence上看到一篇好文,原链接已不能访问.先收藏 转帖自:http://blog.csdn.net/wxq8102/article/details/1735726 1.1基本概念并发 ...
- topcoder srm 600 div1
problem1 link 首先,如果一个数字的某一位是1但是$goal$的这一位不是1,那么这个数字是不用管它的.那么对于剩下的数字,只需要统计在$goal$为1的位上,这些数字对应位上也是1的数字 ...
- POJ1192最优连通子串----树形dp
中文题面,目的很明显,把相邻的两个点看成是两个点之间有一条边,就能当成树形dp来做了. 用一遍dfs可以找出最大的子树权值和. #include<iostream> #include< ...
- Request method 'PUT'/ 'POST' not supported
起因 在项目中遇到需要进行crud操作的功能,用的是Springboot+MybatisPlus+MySQL+AVue,在通过postman测试接口正确性时遇到此错误. 排查过程 因为项目运行是没问题 ...
- 模板引擎ejs入门学习
1:利用 NPM 安装 EJS 很简单 npm install ejs 2:安装完成肯定就是使用了 var template = ejs.compile(str, options); template ...
- python 编码 自动加双斜杠问题
小编最近在进行utf-8转码的时候,遇到一个问题: 当其他编码中含有斜杆,如: 当取出该字符串时,会自动把斜杆转换成双斜杠 导致转码报错: 这时候可以在转码的时候加上,即可转换成功了 .decode( ...