【问题标题】:Why does findOneAndUpdate not return document even though the update does happen?为什么即使更新确实发生了 findOneAndUpdate 也不返回文档?
【发布时间】:2019-05-20 17:46:25
【问题描述】:

我在 nodejs mongodb 库上遇到 findOneAndUpdate 操作的问题,我无法判断更新是否完成。

我写了一个查询,可以按预期成功更新文档,但是更新后返回value:null。最终,我想区分三种情况:

  1. 找到文档,无法更新
  2. 找到并成功更新文档
  3. 找不到文档

    const result = await collection.findOneAndUpdate(
      { caseId: caseId, list: {$ne: userId}, $expr: {$lt:[ {$size: '$list'}, 'maxLength']} },
      { $push: {assignees: userId}})
    return result.value;
    

对查询的一点解释:

如果

,我想将userId 附加到文档的list 字段中
  • caseId 匹配,
  • 用户当前不在list
  • 列表的大小小于maxLength

【问题讨论】:

  • 这不是隐藏的知识。阅读文档:mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate
  • 正如我所提到的,在我的案例中没有返回任何内容,无论是原始文档还是更新的文档。在这种情况下,拥有 {returnOriginal: false} 将无济于事。该帖子中的解决方案没有帮助
  • @Andyk。如果没有返回任何内容,则您的查询不匹配任何内容。
  • @JacobHull 它确实匹配了一些东西。当我直接检查数据库时,新元素会在我第一次运行此查询时附加。令我惊讶的是,添加 $set 运算符解决了我的问题(有关代码,请参见下面的答案)。我不太清楚为什么

标签: node.js mongodb


【解决方案1】:

添加{new: true} 将在结果中返回更新后的文档

const result = await collection.findOneAndUpdate(
  { caseId: caseId, list: {$ne: userId}, $expr: {$lt:[ {$size: '$list'}, 'maxLength']} },
  { $push: {assignees: userId}},
{new: true}
)

【讨论】:

  • 在我的情况下没有返回任何内容,无论是原始文档还是更新的文档。在这种情况下,拥有 {returnOriginal: false} 将无济于事。
  • 我建议{new: true}
【解决方案2】:

添加 $set 更新操作符解决了我的问题。

$push 更新操作符似乎不会触发 nodejs 的更新通知。新元素被附加到集合中,但响应将其视为未完成更新。

const result = await collection.findOneAndUpdate(
  { caseId: caseId, list: {$ne: userId}, $expr: {$lt:[ {$size: '$list'}, 'maxLength']} },
  { $push: {assignees: userId}, $set: {caseId: caseId}})
return result.value;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-17
    • 2018-02-13
    • 1970-01-01
    • 2020-04-29
    • 2021-01-23
    • 2018-07-10
    • 2019-02-07
    • 2021-06-21
    相关资源
    最近更新 更多