问题标签 [mongoose-middleware]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
832 浏览

node.js - mongoose findOneAndSave 和 pre hook,并设置一个初始值( addedOn 日期)

我是 mongoose 的新手,老实说还有大量的阅读工作要做,但我正在研究一个小型宠物项目,该项目可以读取和写入 mongo db。在这种情况下,我想使用猫鼬来确保一致的文档模型。

问题在于独立地确保插入和更新操作中的默认值。特别是,我分别指的是 addedOn 和 updatedOn 字段。我要求持久性的方法是 findOneAndUpdate,它现在支持中间件挂钩(从 4.0 开始)。

我能够使基本挂钩工作(每次都应用 updatedOn 日期),但无法弄清楚如何为默认 addOn 的插入案例添加支持(猫鼬方式)。这是简单的模式和钩子(用于处理插入和更新):

毫不奇怪(因为它确实是赃物)它不起作用。每次运行应用程序时都会插入一行。如果向更新方法添加条件会覆盖默认匹配(尚未挖掘源),则会出现这种情况。

这是我对单独更新案例的初始片段,它找到了行并正确更新,但如上所述无法处理 addedOn(它会每次都更新它)

驱动所有这一切的是这个片段(使代码尽可能接近我正在开发的应用程序的民间故事实现的习惯用法)

我可以修改我的 findOneAndUpdate 函数来添加 addedOn - 但我真的很想正确使用猫鼬钩子。

0 投票
1 回答
1283 浏览

mongodb - 使用 Mongoose 中间件查找值在任一字段中匹配的文档

我有一个源帐户和目标帐户之间的帐户连接列表,所以我的架构看起来像

我想查询 sourceAccountId 或 targetAccountId 等于查询的 accountId 的所有文档。

我看到了这个链接how-to-find-a-document-where-either-one-or-another-field-matches-a-value,这与使用Mongo中的stand find方法查找文档相关。

但是我想使用 Mongoose 中间件来做到这一点,但我不确定如何构建这个条件。

0 投票
0 回答
1110 浏览

node.js - Mongoose: Middleware: Pre: Find: 参数?

如何将请求上下文传递给 Mongoose 中的 Pre find 函数?

以上是我的中间件。我正在使用它如下

但是我的中间件函数没有得到 req 对象?

0 投票
0 回答
661 浏览

node.js - Mongoose Model.find 不是函数 - 在一种情况下失败在另一种情况下有效

我的数据模型中有两个相似的父子关系树,我正在使用 Mongoose 的中间件来处理级联删除。

第一个层次结构表示如下:

博客层次结构

在这种情况下,当在博客实例上调用 remove 时,该Blog.pre('remove'...功能会执行预期的操作并清除博客实例的所有子级。调用代码如下:

我对第二个层次结构做同样的事情,在这里直观地表示:论坛层次结构和以下代码:

但是在这种情况下,当在论坛实例上调用 remove 时,该Forum.pre('remove'...功能会引发错误:TypeError: Post.find is not a function。错误在 forum.js 第 24 行(Forum.pre(...) 块中的第二行)引发

调用代码如下:

虽然我在这里和其他地方的在线研究中发现了这个错误的实例,但原因是错误导出的模型或错误定义的模式。Post 模式在我的其余代码中成功使用,没有任何问题,只是对 Post.find 的调用导致了错误。事实上,我的 postRouter 代码成功调用了以下代码:

0 投票
1 回答
7250 浏览

node.js - Mongoose 中间件发布更新不起作用

回调没有被调用,但它应该按照猫鼬中间件中的记录:

我尝试了预更新并且它有效:

但我想要的是发布更新:

实际模型更新:

我没有看到日志console.warn('results', "is this called?");,这是预期的吗?

ps:机器:windows 10,猫鼬版本:4.5.8

0 投票
1 回答
1087 浏览

mongodb - MongoDB Mongoose 使用嵌套对象保存对象

我是 MongoDB 的新手,我正在使用 Mongoose 创建一个简单的数据库,其中包含以下模型:用户、游戏和玩家。

因此,一个用户不包含任何游戏或包含许多游戏。每个游戏都有玩家,每个玩家指的是一个用户。像这样(为了清楚起见,我简化了模式):

所以,现在在前端,我想向后端发送请愿书,为用户 Joe (_id:11111) 和 Bob (_id:22222) 创建一个新游戏,所以我向 /api/games 发送一个带有正文的 POST{ users: [ 11111, 22222 ] }

现在我的问题是,后端要创建一个新游戏,它还必须创建 2 个玩家。实现这一目标的最佳方法是什么?

在 Game.create() 方法中,我是否应该检索数据、创建和保存玩家、创建游戏、分配玩家、保存游戏以及更新用户和添加游戏 ID?

我还阅读了有关 Mongoose 中间件的信息,您可以在其中设置在某些操作之前或之后执行的某些功能。所以也许更好:在 Game.create 之前的 pre 函数,在 Game.create 之前创建玩家 post 函数,更新用户

最后一个看起来更干净。最好的方法是什么?也许另一个我没有考虑过?

谢谢

0 投票
2 回答
2700 浏览

node.js - Mongoose Middleware pre 'remove' 不起作用,Model.update 不是函数

我为模式设置了一个中间件查询Book

如您所见,它试图从用户的图书列表中删除该图书。作为参考,请参阅User架构(顺便说一下,此查询中的 post 查询有效):

我不断收到此错误,我尝试了查询中的许多变体,但无济于事:

有人可以帮我吗?

0 投票
1 回答
421 浏览

mongodb - 访问 mongoose 父文档以获取子文档中的默认值

我有一个 Express/Mongo 健康跟踪应用程序的后端 API。

weighIns每个用户都有一个包含值、单位和记录日期的子文档数组。如果未指定单位,则单位默认为'lb'

每个用户还有一个 defaultUnit 字段,可以为该用户指定一个默认单位。如果该用户在未指定单位的情况下发布了 weightIn,则该 weightIn 应使用用户的 defaultUnit(如果存在),否则默认为'lb'.

这个逻辑的正确位置在哪里?

我可以在我的 WeighInsController 的 create 方法中轻松地做到这一点,但这似乎充其量不是最佳实践,最坏的情况是反模式。

似乎不可能在 Mongoose 模式中指定对父文档的引用,但我认为更好的选择是在pre('validate')子文档的中间件中。我也看不到在子文档中间件中引用父文档的方法。

注意:这个答案不起作用,因为我不想覆盖所有用户的 WeighIns 单位,只是在POST请求中未指定时。

我是否被困在我的控制器中?我从 Rails 开始,所以我的大脑上刻有“胖模型,瘦控制器”。

0 投票
0 回答
117 浏览

node.js - 无法访问预保存中间件 mongoose 中的架构属性

遇到一个奇怪的问题,我无法在预保存中间件中访问我的任何架构属性。当我将鼠标悬停在该属性上时,我能够看到此错误:

“文档类型上不存在属性 createdAt”

以下是我的代码:

0 投票
1 回答
651 浏览

node.js - Mongoose 使用 presave 中间件推送到数组

我正在尝试使用猫鼬中可用的 presave 钩子更新数组。我将此数组用于审计目的,因此我想使用这些中间件强制执行正确的值

这是我的架构

该逻辑在保存中间件挂钩方面效果很好。

在 findOneAndUpdate 挂钩中使用时出错

我不确定我在这里缺少什么。这是错误

我看到 this.events 是未定义的。

如何访问该数组以更新它?我也应该忽略 request.body.events 中发送的任何内容

提前致谢。