最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

MongoDB 4.2:按ID查找并仅在其错误时更新另一个字段(布尔值),并确定响应为空的原因

网站源码admin16浏览0评论

MongoDB 4.2:按ID查找并仅在其错误时更新另一个字段(布尔值),并确定响应为空的原因

MongoDB 4.2:按ID查找并仅在其错误时更新另一个字段(布尔值),并确定响应为空的原因

我正在尝试通过id字段查找文档,然后仅当该字段的值为false时才更新该文档的另一个字段(isLocked)。我只想更新isLockedField

MongoDB版本为4.2。

我的第一种方法是执行两个两个查询:

  1. 通过其ID查找文档。如果未找到任何内容,则抛出NotFoundError
  2. 通过执行查询{ id: 'the-id', isLocked: false }并返回新文档来查找和更新文档。如果此查询返回空响应,则表示文档已锁定,然后抛出LockedError(423)。

然后,我通过同时执行两个查询来优化该方法。在两个承诺都解决后,如果对应,则抛出特定错误。

是否有另一种形式只需要对数据库进行一次查询,并且能够识别(如果返回了空响应,为什么为空(通过其ID找不到或因为它被锁定了?)?

回答如下:

如果您不想将isLocked更新为true,例如它不存在或与false完全不同,可以使用findOneAndUpdate并将聚合管道指定为更新参数。

const result = db.collection('yourCollection').findOneAndUpdate(
    { id: 'this-id' },
    [{ $set: { isLocked: { $cond: { if: { $eq: ['$isLocked', false] }, then: true, else: '$isLocked' } } } }]
)

if (result.value === null) return NotFoundError
if (result.value.isLocked) return LockedError

结果对象的value字段包含更新操作之前的文档。

参见:http://mongodb.github.io/node-mongodb-native/3.5/api/Collection.html#findOneAndUpdate

发布评论

评论列表(0)

  1. 暂无评论