Mongoose find 查詢返回json數據處理方式
前言
Mongoose find方法,打印看著返回的是json數據,實際返回的是Mongoose實例,為瞭方便自定義拓展或操作鏈式操作。
需求
如圖復制按鈕,點擊復制按鈕填寫信息,復制出有相同屬性的數據模型;
處理思路
傳參:{id:"", //被復制的數據模型id …(其他填寫參數) };通過id查詢被復制數據模型所有數據,刪除數據id,刪除屬性id,其他填寫參數覆蓋,然後寫庫。
遇到問題
代碼如下,執行時,直接報堆棧溢出,獲取的modalData不是json數據不能modalData.props或{…modalData}
/** * 根據id查詢數據模型 * @param id 數據模型id */ async findById(id: string | string[]) { let res try { if (Array.isArray(id)) { res = await this.dataModel.find({ _id: { $in: id } }) } else { res = await this.dataModel.findById(id) } } catch (error) { throw new HttpException(error, HttpStatus.INTERNAL_SERVER_ERROR) } return res; } /** * 復制數據模型 * @param dataModel 數據模型 */ async copyDataModal(dataModel: CopyDataModelDto) { let res try { const { id } = dataModel const modalData = await this.findById(id) if (modalData) { modalData.props = (modalData.props || []).map((ele: any) => { return dataMasking(ele, ['_id']) }) const addData = dataMasking({ ...modalData, ...dataModel }, ['_id', 'id', '__v']) // res = await this.add(addData) res=addData } } catch (error) { throw new HttpException(error, HttpStatus.INTERNAL_SERVER_ERROR) } return res }
解決方案
1.modalData=JSON.parse(JSON.stringify(modalData))處理一遍
缺點:數據復雜時會導致部分數據丟失或轉義
2.Mongoose find 查詢時用.toObject()或.toJSON()將數據轉換為json,修改findById方法的return;
return res?res.toObject():res return res?res.toJSON():res
3.Mongoose find 查詢後.lean().exec()鏈式處理
async findById(id: string | string[]) { let res try { if (Array.isArray(id)) { res = await this.dataModel.find({ _id: { $in: id } }).lean().exec() } else { res = await this.dataModel.findById(id).lean().exec() } } catch (error) { throw new HttpException(error, HttpStatus.INTERNAL_SERVER_ERROR) } return res }
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- node.js連接mongoose數據庫方法詳解
- 教你使用mongoose實現多集合關聯查詢
- nestjs返回給前端數據格式的封裝實現
- MongoDB連接數據庫並創建數據等使用方法
- 避免地獄async await的使用及原理解析