NestJS调用MongoDB listCollections设nameOnly:true返回空数组
问题原因
传参位置错误是返回空数组的核心原因。
MongoDB Node.js 驱动的 listCollections 方法接收两个参数:
- 第一个参数为集合过滤规则(filter),用于匹配符合条件的集合,传空对象即返回全部集合
- 第二个参数才是调用配置项(options),你使用的
nameOnly: true属于配置项范畴,需要放在第二个参数位置传入
你将 { nameOnly: true } 作为第一个过滤参数传入时,驱动会查找自身属性包含 nameOnly: true 的集合,没有匹配结果自然返回空数组。
另外你提到的“移除nameOnly配置会对数据库加锁”是错误认知,该操作不会加锁,只是默认会返回集合的完整元数据(包含索引配置、集合属性等冗余信息),响应数据量更大。
修复方案
调整传参顺序,明确传入过滤参数和配置项即可,修正后的代码如下:
@Get(':client_name/listCollections') async collections(@Param('client_name') client_name) { const db = await this.databaseService.connectToDatabase(client_name); try { // 第一个参数传空对象表示不过滤集合,第二个参数传入nameOnly配置 return await db .listCollections({}, { nameOnly: true }) .toArray(); } catch (error) { throw error; } }
如果需要直接获取纯集合名称的一维数组,可以在结果返回前做一次映射处理:
const collectionList = await db.listCollections({}, { nameOnly: true }).toArray(); return collectionList.map(item => item.name);
提示:部分旧版本MongoDB Node.js驱动对参数校验不严格,如果漏传第一个filter参数直接传入options,也会出现参数解析异常,显式传入第一个空对象作为过滤规则是兼容性最好的写法。
内容的提问来源于stack exchange,提问作者Tom Cockram
相关产品推荐
相关产品推荐

