Keystone中如何在Music模型保存后获取Quality关联数据而非ID数组
在Keystone中获取关联字段的完整数据而非ID数组
嘿,这个场景我太熟悉了!在Keystone的post('save')钩子里直接访问关联字段,默认确实只会返回关联文档的ID数组——毕竟Keystone底层依赖的Mongoose,默认不会自动加载关联数据。想要拿到Quality的具体数据,你可以试试这两个简单的方法:
方法一:直接在文档实例上调用populate
钩子里的doc是Mongoose的文档对象,你可以直接调用它的populate()方法来加载关联数据,不需要重新查询整个集合:
Music.schema.post('save', async function(doc) { // 加载quality关联的完整数据 await doc.populate('quality'); // 现在doc.quality就是完整的Quality对象数组啦 console.log(doc.quality); });
这个方法最直接,性能也更好——它基于已有的文档实例去加载关联,不用额外查询Music文档,只需要拉取对应的Quality数据。
方法二:重新查询文档并populate
如果需要确保拿到的是保存后最新的文档状态(比如有其他中间件在保存后修改了数据),可以重新通过ID查询并指定populate字段:
Music.schema.post('save', async function(doc) { // 重新查询Music文档并加载quality关联 const updatedMusic = await Music.findById(doc._id).populate('quality'); console.log(updatedMusic.quality); });
小提醒
- 一定要加
await!不管是doc.populate()还是findById().populate()都是异步操作,不加的话你拿到的会是Promise对象,不是实际的数据。 - 因为你的
quality字段设置了many: true,所以populate后得到的是对象数组;如果是单个关联,那就是单个对象。
内容的提问来源于stack exchange,提问作者smas
相关产品推荐
相关产品推荐

