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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.07 16:15:41