You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:05:27