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
作者:游弋在冷风中
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.