如何从含重复项的ObjectID数组中提取唯一ObjectID?
过滤MongoDB ObjectID数组重复项(保留原对象)
嘿,这个场景我太熟悉了!MongoDB的ObjectID是引用类型,哪怕两个对象的ID值完全一样,直接用普通的Set或者去重方法根本没用——因为它们是不同的对象引用嘛。不过咱们可以借助ObjectID的字符串表示来实现去重,同时完整保留原ObjectID对象,给你两个实用的方案:
方案1:使用filter + Set(简洁直观)
这个方法用Set来记录已经见过的ID字符串,配合filter过滤数组,代码简洁易懂:
// 初始化一个空Set用来存已经出现过的ID字符串 const seenIds = new Set(); // 过滤数组,只保留未出现过的ObjectID对象 const uniqueObjectIds = objectIdArray.filter(objId => { const idStr = objId.toString(); if (seenIds.has(idStr)) { // 已经见过这个ID,过滤掉 return false; } // 没见过,把ID字符串加入Set,保留当前对象 seenIds.add(idStr); return true; });
执行完后,uniqueObjectIds就是去重后的ObjectID数组,里面全是原对象,没有重复项。
方案2:使用reduce + Map(灵活可控)
如果后续需要快速通过ID查找对应的ObjectID对象,这个方法会更实用,它同时生成去重数组和ID映射表:
const uniqueObjectIds = objectIdArray.reduce((accumulator, currentObjId) => { const idStr = currentObjId.toString(); // 检查Map里有没有这个ID的记录 if (!accumulator.idMap.has(idStr)) { // 没有的话,把ID和对象存入Map,同时加入结果数组 accumulator.idMap.set(idStr, currentObjId); accumulator.result.push(currentObjId); } return accumulator; }, { idMap: new Map(), result: [] }).result;
除了得到去重后的数组,你还能通过accumulator.idMap快速根据ID字符串找到对应的ObjectID对象。
核心原理说明
MongoDB的ObjectID.toString()方法会返回统一格式的ID字符串(比如"5afa54e5516c5b57c0d43227"),只要两个ObjectID的实际ID值相同,它们的toString结果就完全一致——这就是我们判断重复的核心依据,既能准确去重,又能完整保留原ObjectID对象。
内容的提问来源于stack exchange,提问作者Kevin Novak
相关产品推荐
相关产品推荐

