字段(布尔值),并确定响应为空的原因"/>
MongoDB 4.2:按ID查找并仅在其错误时更新另一个字段(布尔值),并确定响应为空的原因
我正在尝试通过id
字段查找文档,然后仅当该字段的值为false时才更新该文档的另一个字段(isLocked
)。我只想更新isLockedField
。
MongoDB版本为4.2。
我的第一种方法是执行两个两个查询:
- 通过其ID查找文档。如果未找到任何内容,则抛出
NotFoundError
。 - 通过执行查询
{ 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
更多推荐
MongoDB 4.2:按ID查找并仅在其错误时更新另一个字段(布尔值),并确定响应为空的原因
发布评论