JavaScript中如何判断Realm ObjectId与字符串是否相等
解决MongoDB Realm中ObjectId与同值字符串相等判断失败问题
核心原因
该问题本质是MongoDB BSON封装和Realm运行环境的特性导致:
- ObjectId是引用类型,直接用
==/===比较两个同值ObjectId实例时,判断的是内存地址而非值,必然返回false - 部分Realm环境下调用ObjectId的
toString()方法会返回ObjectId("xxx")格式的带包裹字符串,而非纯24位hex id值,和纯字符串比较自然不相等 - 控制台打印ObjectId实例时会自动转为字符串输出,导致你误判二者实际值一致
正确操作方式
方法1:转纯hex字符串后比较
统一调用ObjectId的toHexString()方法获取纯id字符串后再做全等判断:
// 示例(Realm JS SDK/Realm Functions环境) import { BSON } from "realm"; const objectId = BSON.ObjectId(); const idString = objectId.toHexString(); // 正确比较逻辑 const isEqual = objectId.toHexString() === idString;
方法2:用ObjectId内置的equals方法比较
如果已经将字符串转为ObjectId实例,使用equals()方法做值对比:
const objId1 = BSON.ObjectId("650f8b7a9d1e8c2a3b4c5d6e"); const objId2 = BSON.ObjectId("650f8b7a9d1e8c2a3b4c5d6e"); // 错误:引用对比,返回false // console.log(objId1 === objId2) // 正确:值对比,返回true const isEqual = objId1.equals(objId2);
方法3:Realm查询场景直接传值
如果是在Realm查询语句中匹配_id,不需要手动转型,Realm会自动兼容字符串和ObjectId类型:
const targetIdStr = "650f8b7a9d1e8c2a3b4c5d6e"; // 直接传字符串即可,Realm会自动转换匹配ObjectId类型的_id字段 const result = realm.objects("YourCollection").filtered("_id == $0", targetIdStr);
排查技巧
如果仍有问题,用以下代码输出二者的真实类型和值,避免被控制台自动格式化误导:
console.log( "值1:类型%s, 构造函数%s, 序列化结果%s", typeof val1, val1?.constructor?.name, JSON.stringify(val1) ); console.log( "值2:类型%s, 构造函数%s, 序列化结果%s", typeof val2, val2?.constructor?.name, JSON.stringify(val2) );
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

