MongoDB查询数组字符串并提取嵌套对象ID的问题求助
问题分析与解决方案
原代码的核心问题
- 游标处理错误:
db.getCollection("customers").find()返回的是MongoDB游标,不是数组,直接调用map不会生效,必须先通过.toArray()转换成数组。 - 嵌套数组访问错误:
notificationAccount是数组类型,不能直接用singleCustomerProfile.notificationAccount.notificationAccountId访问,得遍历数组里的每个对象。 - 语法错误:代码里存在括号不匹配、模板字符串引号错误(应该用反引号
`)、拼写错误(notficiationAccount应为notificationAccount)。 - 空值判断错误:游标本身永远不会是
null,要判断是否找到文档,得看转换成数组后的长度是否大于0。
修正后的循环代码
const mainNumbers = ["123", "234", "345"]; const accountIds = []; for (const mainNumber of mainNumbers) { // 转换为数组,方便后续处理 const customerProfiles = db.getCollection("customers").find({ mainNumber }).toArray(); if (customerProfiles.length > 0) { customerProfiles.forEach(singleCustomer => { // 遍历notificationAccount数组,提取每个id singleCustomer.notificationAccount.forEach(acc => { accountIds.push(acc.notificationAccountId); print(`${mainNumber} ${acc.notificationAccountId}`); }); }); } else { print(`${mainNumber} was not found.`); } } // 最终输出所有收集到的id print(`All accountIds: ${accountIds}`);
更简洁的查询方式(推荐)
不用循环逐个查询,直接通过一次聚合查询匹配所有mainNumbers,一次性提取所有目标ID,效率更高:
const mainNumbers = ["123", "234", "345"]; const accountIds = db.getCollection("customers").aggregate([ // 匹配mainNumber在目标数组中的文档 { $match: { mainNumber: { $in: mainNumbers } } }, // 拆分数组,每个notificationAccount元素单独成文档 { $unwind: "$notificationAccount" }, // 只保留需要的字段 { $project: { _id: 0, notificationAccountId: "$notificationAccount.notificationAccountId" } }, // 将所有id收集到数组中 { $group: { _id: null, ids: { $push: "$notificationAccountId" } } } ]).toArray()[0]?.ids || []; print(`All accountIds: ${accountIds}`);
额外说明
你的集合结构示例里notificationAccount数组的语法有误,正确的格式应该是:
{ "_id": ObjectId("1223334abc"), "mainNumber": "123", "notificationAccount": [ { "channel": "Apple", "notificationAccountId": "700002" } ] }
数组里的元素必须是对象,要用大括号包裹键值对。
内容的提问来源于stack exchange,提问作者user8387535
相关产品推荐
相关产品推荐

