【发布时间】:2017-12-16 01:57:00
【问题描述】:
我希望在保存特定模型后自动填充子文档。我真正想要的是如下所示:
MyModel.post('save', function(doc, next) {
doc.populate('path').then(next);
});
但是,上述方法不起作用,因为
post中间件不直接接收流量控制,例如没有next或done回调传递给它。post钩子是为这些方法注册传统事件监听器的一种方式。
当然,还有“异步 Post Hooks”,但它们仍然不接收控制流,因此无法保证在我需要时会填充子文档。
为什么不直接使用嵌入文档呢?对于这种情况,子文档与父文档相同(例如,我正在使用类似 Composite 模式的东西),这将导致我不确定如何解决(或者我什至可以解决它)的循环依赖.对于其他情况,我可能希望能够在不通过父文档的情况下访问子文档。
我考虑的另一种方法是:
const nativeSave = /* ? */;
MyModel.methods.save = function save() {
return nativeSave.call(this).then(function(savedDoc) {
return savedDoc.populate('path');
});
};
但是,这样做有两个问题。首先,这似乎是一个迂回的解决方案。如果有一种更原生的方法不违背 mongoose 的实现,我会更喜欢。其次,我不知道我会将nativeSave 设置为什么(/* ? */ 很明显)。
那么,对于获得这种行为有什么建议?如果我的第二个解决方案对于当前版本的猫鼬来说是最好的,我应该将nativeSave 设置为什么?我已经考虑过嵌入式文档,所以请不要建议使用它们,除非您提供有关解决循环依赖的建议。即便如此,我也想要我提到的其他用例的解决方案。
正如我在评论中所解释的,这与在保存后手动填充子文档不同,因为其他帖子的要求。我希望这能自动发生,以避免泄露我的实现细节(例如,使用 ObjectIds 而不是真实文档)。
【问题讨论】:
-
Mongoose populate after save 的可能重复项。如果您问如何确保这种情况总是发生,我不确定这是一个真实的用例。
-
那篇文章是关于在保存后手动填充单个文档,我的问题是让这在幕后自动发生。我展示了完成前者所需的知识,并在问题中提供了我的用例。基本上,我不想将我的实现细节泄露给使用我的模型的东西,这似乎是合理的。
-
我想你可以对模型的保存方法进行猴子补丁。这可能是个坏主意(你不知道你是否总是想在每次保存时都进行填充)。即使您走这条路,或者您使用了静态或模式方法,该线程也会向您展示所有方法。
标签: mongoose