nodejs操作 mongoose(mongodb)和Sequelize(mysql)查詢數據后添加新屬性未生效


最近在着手koa時候,發現mongoose(mongodb)查詢數據庫后添加新屬性,前端拿不到新屬性問題,

然后測試了一下Sequelize(mysql),發現也有同樣的問題存在。此時着手干!

1.1 mongoose問題展示:

 1 router.get('/order_show', async (ctx, next) => {
 2     const id = ctx.query.id
 3     try {
 4         let doc = await Order.findOne({ _id: id }).populate(['buyid', 'address'])    
 5         doc.goods.forEach(async (item, index) => {
 6             const goodsdata = await Goods.findOne({ id: item.id })
 7             doc.goods[index].list = goodsdata
 8         })
 9         if (!doc) {
10             await ctx.render('order/order_show', { orderInfo: null })
11             return false
12         }
13         await ctx.render('order/order_show', { orderInfo: doc })
14     } catch (err) {
15         console.log(err)
16         await ctx.render('order/order_show', { orderInfo: null })
17     }
18 
19 })

問題:以上案例,獲取訂單詳情信息,要查詢出訂單詳情里面每條商品的數據,先查詢出來該訂單的數據,然后循環訂單數據里面商品數組,再根據數組去根據每一個id去獲取對應的商品數據。

獲取到商品數據后,這時候就想追加到原來獲取到的商品數組里面的每一項的list屬性里面,但時候這時候發現,直接設置並沒有效果哦!

很詭異吧,但是經過查詢了mongoose文檔之后,才發現原來mongoose查詢出來的數據發現訪問以上域名的時候,前台模板並沒有list這個屬性。

經過查詢mongoose 文檔,知道mongoose查詢出來的對象是document對象,並不是普通的javascript對象,所以設置list屬性並未生效。

1.2  mongoose(mongodb)解決方法:

將document對象轉換為普通的javascript對象,我們可以使用mongoose的Document.prototype.toObject()方法進項轉換。修改代碼如下:

經過先把document對象轉換為普通javascript對象之后,我們就可以使用js object的方法去設置新屬了。

 1 router.get('/order_show', async (ctx, next) => {
 2     const id = ctx.query.id
 3     try {
 4         let doc = await Order.findOne({ _id: id }).populate(['buyid', 'address'])    
 5         doc = doc.toObject() // 修改這里就可以,將doc轉換為Object對象
 6         doc.goods.forEach(async (item, index) => {
 7             const goodsdata = await Goods.findOne({ id: item.id })
 8           doc.goods[index].list = goodsdata
 9         })
10         if (!doc) {
11             await ctx.render('order/order_show', { orderInfo: null })
12             return false
13         }
14         await ctx.render('order/order_show', { orderInfo: doc })
15     } catch (err) {
16         console.log(err)
17         await ctx.render('order/order_show', { orderInfo: null })
18     }
19 
20 })

 

測試了mongoose 操作mongodb的問題之后,接着我就試了mysql的工具 Sequelize的,設置新屬性,並沒有效果。

2.1  Sequelize問題展示:

1 for (let i = 0; i < goods.length; i++) {
2     let brandInfo = await Brand.findById(goods[i].brand_id)
3     goods[i].brandInfo = brandInfo 
4 }

問題:以上案例,user_info這個屬性並沒有添加上去

 

去查詢了Sequelize的文檔,查詢到這個方法可以去操作查詢出來的數據結構變化:

setDataValue(key, value)

2.2  Sequelize(mysql)解決方法:

1 for (let i = 0; i < goods.length; i++) {
2     let brandInfo = await Brand.findById(goods[i].brand_id)
3     goods[i].setDataValue( 'brandInfo', brandInfo )
4 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM