为何MongoDB&Mongoose按子文档查询时aggregate返回0结果而find正常
问题原因
- Mongoose的
find()查询会自动遵循Schema的字段类型定义做隐式类型转换,你传入的字符串格式userId会被自动转为ObjectId类型,和数据库中存储的members.user_id类型匹配,所以可以正常返回结果。 aggregate()聚合框架默认不会执行Schema的隐式类型转换,你传入的是字符串类型的userId,和数据库中ObjectId类型的members.user_id类型不匹配,因此无法匹配到任何文档,返回空数组。
解决方案
在match阶段手动将字符串类型的userId转换为ObjectId类型即可,修改后的代码如下:
// 引入mongoose内置的ObjectId工具 const { ObjectId } = require('mongoose').Types; await this.groupModel .aggregate<GroupDocument>() .match({ 'members.user_id': new ObjectId(userId) // 手动转换为ObjectId类型 }) .addFields({ members_count: { $size: '$members' }, })
如果业务中可能存在不符合ObjectId格式的userId,可以先加合法性校验避免抛出错误:
if (!ObjectId.isValid(userId)) { // 自定义非法ID的处理逻辑,例如直接返回空数组 return [] }
内容的提问来源于stack exchange,提问作者kaname-png
相关产品推荐
相关产品推荐

