无法通过指定ID列表过滤MongoDB数据数组的技术求助
问题
无法根据给定的ID列表过滤设备数据数组,目标是获取所有匹配指定personId列表的设备对象。
数据库记录原型:
[ { "_id": ObjectId("630a2e258bb6b10016ca68f1"), "deviceId": "42925f6a6eec14d8", "personId": ObjectId("630a2e218bb6b10016ca68eb"), "createdAt": 1661611557637, "updatedAt": 1661611557637 }, { "_id": ObjectId("630a2e258bb6b10016ca68f1"), "deviceId": "42925f6a6eec14d8", "personId": ObjectId("630a2e218bb6b10016ca68eb"), "createdAt": 1661611557637, "updatedAt": 1661611557637 }, { "_id": ObjectId("630a2e258bb6b10016ca68f1"), "deviceId": "42925f6a6eec14d8", "personId": ObjectId("630a2e218bb6b10016ca68eb"), "createdAt": 1661611557637, "updatedAt": 1661611557637 }, { "_id": ObjectId("630a2e258bb6b10016ca68f1"), "deviceId": "42925f6a6eec14d8", "personId": ObjectId("630a2e218bb6b10016ca68eb"), "createdAt": 1661611557637, "updatedAt": 1661611557637 } ]
尝试的实现代码:
getData: async function (req, res) { // var db = Device.getDatastore().manager; let ObjectId = require("mongodb").ObjectID; let usersID = [ "62f79104bb4b3d0016260b88", "62f925a3bcbc910016a360b6", "630a2e218bb6b10016ca68eb", ]; var devices = await Device.find({ personId: { $in: [...usersID], }, }); if (!devices) { return res.badRequest("Please specify search criteria"); // var devices = await Device.find(); } return res.successResponse( devices, 200, null, true, "${devices.size()} roles are found." ); },
解决方案
过滤失败的核心原因是数据库中personId存储的是ObjectId类型,但传入的usersID是字符串数组,MongoDB无法匹配不同类型的值。
修复步骤
- 将
usersID数组中的每个字符串转换为ObjectId类型 - 修正响应消息的模板字符串语法(原生JS模板字符串需用反引号而非双引号)
- 调整空结果判断逻辑(MongoDB查询始终返回数组,不会返回null)
修复后的代码:
getData: async function (req, res) { const ObjectId = require("mongodb").ObjectID; const usersID = [ "62f79104bb4b3d0016260b88", "62f925a3bcbc910016a360b6", "630a2e218bb6b10016ca68eb", ]; // 将字符串ID转换为ObjectId const objectIdList = usersID.map(id => new ObjectId(id)); const devices = await Device.find({ personId: { $in: objectIdList } }); // 空结果判断改为检查数组长度 if (devices.length === 0) { return res.badRequest("No devices found matching the provided person IDs"); } return res.successResponse( devices, 200, null, true, `${devices.length} devices are found.` // 修正模板字符串语法与描述笔误 ); },
额外说明
- 若使用Mongoose而非原生MongoDB驱动,可替换为
mongoose.Types.ObjectId进行类型转换 - 原代码中
roles为笔误,需改为devices以匹配业务场景
内容的提问来源于stack exchange,提问作者Developer Nans
相关产品推荐
相关产品推荐

