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。

推薦閱讀: