Mongoose判断value是否为'_id',有多处小坑,mongo查询结果判断是否有指定键,多种业务场景

缘由:使用Mongoose时遇到一些传入的——id字段可能不正确的业务场景,需要校验

  • 首先校验是否为ObjectId类型
  • 然后将ObjectId.isValid()返回为true的参数先强制转换为ObjectId
  • 最后比较或查询校验字段是否为有效_id

1. 代码中先引入mongoose库

const mongoose = require('mongoose')

2. 定义ObjectId

const { ObjectId } = mongoose.Types

3. 校验参数是否为ObjectId类型

console.log(ObjectId.isValid(test))

以上打印的是test参数校验是否为ObjectId类型,返回true,test参数即为ObjectId类型,换回false,test参数即不为ObjectId类型
ObjectId.isValid()使用也有一些坑,因为ObjectId.isValid()会把任意12个字符长的字符串也返回true,这样就会有一些无效ID被视为有效,所以需要进一步验证

4. 将ObjectId.isValid()返回为true的参数先强制转换为ObjectId

const object_id = new ObjectId(test)

以上操作为:将test参数强行转换为ObjectId
注意:ObjectId.isValid()返回为false的参数不能强行转换为ObjectId
任意12个字符长的字符串经过new ObjectId()转换后会成为ObjectId,转换后的参数值为_id类型参数值
例如:new ObjectId('abdcefghijkl')转换后会成为ObjectId,转换后的参数值为'6162636465666a68696a6b6c'
有效的_id字段参数经过new ObjectId()转换后依旧是ObjectId,且参数值不变
例如:new ObjectId('5ffd71f01af0466bd07e04ef')转换后依旧是ObjectId,且参数值不变,转换后的参数值为'5ffd71f01af0466bd07e04ef'

5. 通过比较数据库已有_id字段值或查询来判断参数是否为有效ID

const result = await this.Model.findById(object_id)

result返回null,test参数即为无效_id,否则,test参数即为有效_id

6. 需要对查询出的mongo对象进行判断,判断是否拥有指定的键

const result = await this.Model.findById(object_id)
result.hasOwnProperty('name')   // 怎么查都是false,即使result打印有name键也为false,因为查询的是mongo对象,并不是js里的正常对象/字典
result._doc.hasOwnProperty('name')   // 正确用法,加了_doc才能进行hasOwnProperty判断

遇到不明白的参数可以在vscode调试里的监视里放入参数进行查看

7. MongoDB ObjectId转字符串,用来方便与字符串形式的id进行比较

const id = '60eda3539a813a5fc073e751'
const strid = mongoose.Types.ObjectId(id).toString()

转换成strid才是字符串类型,直接用mongo查询结果._id得到的是objectId

Computer science and software engineering have always been my passion

posted @ 2021-01-22 14:52  游弋在冷风中  阅读(406)  评论(0)    收藏  举报