如何通过Mongoose获取字符串类型的ID数组而非ObjectId对象数组
解决MongoDB distinct返回ObjectId数组转字符串数组的问题
嗨,我懂你现在的困扰——用distinct('_id')拿到的是一堆ObjectId实例,而你需要纯字符串数组来做后续查询。这里有两种简单直接的解决办法:
方法一:获取数据后用JavaScript转换
这是最快捷的方式,利用数组的map方法遍历结果,把每个ObjectId转成字符串:
const ids = await Db.find({accountStatus: "active"}).distinct('_id'); // 转成目标字符串数组 const stringIds = ids.map(id => id.toString()); // 也可以用toHexString(),效果完全一致 // const stringIds = ids.map(id => id.toHexString());
ObjectId实例自带的toString()和toHexString()方法,都能返回你需要的十六进制格式ID字符串,选哪个都可以。
方法二:让数据库直接返回字符串ID(聚合管道方式)
如果不想在代码里做额外转换,可以用MongoDB的聚合管道,在查询阶段就把_id转成字符串,同时实现去重(模拟distinct的效果):
const result = await Db.aggregate([ // 先筛选出活跃账户 { $match: { accountStatus: "active" } }, // 把_id转成字符串并分组去重 { $group: { _id: { $toString: "$_id" } } }, // 重命名字段方便后续收集 { $project: { _id: 0, id: "$_id" } }, // 把所有id收集到一个数组里 { $group: { _id: null, ids: { $push: "$id" } } }, // 只返回最终的ids数组 { $project: { _id: 0, ids: 1 } } ]).next(); // 拿到字符串数组,空数组做兜底处理 const stringIds = result?.ids || [];
另外提一句:其实如果你只是要把这些ID用在另一个查询的$in条件里,MongoDB是支持直接传入ObjectId数组的,比如Db.find({ _id: { $in: ids } }),数据库会自动处理ObjectId和字符串ID的匹配,但既然你明确需要字符串数组,上面的方法就完全能满足需求啦。
内容的提问来源于stack exchange,提问作者Egidius
相关产品推荐
相关产品推荐

