我正在尝试更新pre钩子的计数。问题是由于一些未知的原因,findOneAndUpdate
钩子没有访问文档的权限,就我所知。
我想这样做:
source.pre('findOneAndUpdate', function (next) {
console.log('------------->>>>>> findOneAndUpdate: ');
this.objects = this.objects || [];
this.people = this.people || [];
this.events = this.events || [];
this.objectCount = this.objects.length;
this.peopleCount = this.people.length;
this.eventCount = this.events.length;
next();
});
但是由于某种原因,钩子中的this
不是文档,而是一个看起来毫无用处的Query对象。
我遗漏了什么?* 如何使用pre钩子更新findOneAndUpdate上的计数?*
7条答案
按热度按时间iyzzxitl1#
你可以这样做-〉
注意_update.$set,因为在上下文中“this”将是一个查询。2所以你可以很容易地添加你想要的任何东西!
pgvzfuti2#
该文件规定:
查询中间件与文档中间件有一个细微但重要的区别:在文档中间件中,
this
指的是要更新的文档,在查询中间件中,mongoose不一定有要更新的文档的引用,所以this
指的是query对象,而不是要更新的文档。一个更新动作通常更新一个只存在于数据库中的文档(它告诉MongoDB服务器:* “查找文档X并将属性X设置为值Z”*),因此Mongoose无法使用完整的文档,因此,您无法更新计数(这至少需要访问您要确定其长度的数组)。
顺便说一句:为什么在模式中需要单独的
*Count
属性呢?如果要查询与特定大小匹配的数组,可以直接在数组上使用$size
操作符。如果确实需要count属性,那么对于每次更新,都需要跟踪对每个数组所做的更改的数量(根据添加/删除的项数),并使用
$inc
操作符来调整计数。lstz6jyr3#
我在使用updateOne方法时遇到了类似的问题,我还打算在保存到数据库之前使用updateOne pre钩子进行间歇性更新。我找不到一种方法来使它工作。我最终使用了findOneAndUpdate pre钩子并在其中执行updateOne。
wyyhbhjk4#
另一个解决方案是使用中间件上的官方MongoDB文档。他们解释了为什么“this”不是指文档本身。你可以尝试一下这个意义上的东西:
crcmnpdw5#
这对我很有效
tnkciper6#
unhi4e5o7#
mongoose文档: