Mongoose Virtual Populate无返回数据,mongoose#trustedSymbol是什么?
一、Virtual Populate 无返回数据的原因及修复
你遇到的问题90%概率是Virtual字段默认未开启序列化导致的:
Mongoose 默认不会将虚拟字段(virtual)自动加入到 JSON 或普通对象的输出结果中,即使 populate 已经成功查询到关联的 posts 数据,直接打印 user 实例或者返回给前端时也看不到 posts 字段。
修复方案
在 User Schema 的配置项中新增 virtual 序列化开关即可:
const schema = new Schema( { name: { type: String, required: true, }, }, { timestamps: true, discriminatorKey: 'type', // 新增以下配置 toJSON: { virtuals: true }, toObject: { virtuals: true } } )
如果不想全局开启,也可以在需要输出的时候手动调用:const userJson = user.toJSON({ virtuals: true })
另外注意从debug日志可见自动生成的populate查询自带limit: 10配置,如果你对应账号的关联posts超过10条,可在populate时手动指定limit:const user = await UserModel.findById(req.params.id).populate({ path: 'posts', limit: 100 })
你贴出的手动查询代码里写的credential字段属于手误,实际执行的查询条件和自动生成的完全一致,可排除数据不存在的问题。
二、mongoose#trustedSymbol 的作用
这是 Mongoose 内部使用的标记符号,仅用于标识当前查询条件是 Mongoose 内部生成的可信内容,不是来自用户输入的不可信内容,作用是避免查询注入攻击。
该标记仅在 Mongoose 内部处理流程中使用,不会传递到 MongoDB 服务端,不会对查询结果产生任何影响,不是你无返回数据的原因,可以忽略。
内容的提问来源于stack exchange,提问作者jmtt89

