使用参数 {new:true} 的Mongoose updateOne方法未显示实际更新的值

4

我已经苦苦思索几个小时,想要展示通过mongoose updateOne更新文档后的最终值。当我在Postman上调用端点时,可以看到“nModified:1”,说明我成功地进行了修改,但是我无法输出实际的最终文档 - 即使使用参数{new:true}

以下是路由的代码:

// 3. We check if blockid is in this project
        Block.findById(req.params.blockid)
          .then(block => {
            if (!block) {
              errors.noblock = "Block not found";
              return res.status(404).json(errors);
            }

            // 4. We found the block, so we modify it
            Block.updateOne(
              { _id: req.params.blockid },
              { $set: blockFields },   // data to be updated
              { new: true },           // flag to show the new updated document
              (err, block) => {
                if (err) {
                  errors.noblock = "Block not found";
                  return res.status(404).json(errors);
                }
                console.log(block);
                res.json(block);
              }
            );
          })
          .catch(err => console.error(err));

相反,我得到的输出是这样的(Mongoose处于调试模式)

Mongoose output

有什么想法吗?

非常感谢

3个回答

11

{ new : true }选项会返回修改后的文档而不是原始文档。 updateOne没有这个选项。 如果需要响应已更新的文档,请使用findOneAndUpdate

下面是您可以使用 { new : true }mongoosejs函数列表:

  • findByIdAndUpdate()
  • findOneAndUpdate()
  • findOneAndDelete()
  • findOneAndRemove()
  • findOneAndReplace()

1
感谢@sivasankar的回答。这是使用findOneAndUpdate的更新后的工作版本。

mongoose new function findoneandupdate

这里是预期的结果:

terminal result outputting the document


0

您应该将第二个参数作为数据键值对对象传递, 不要像$Set:blockfields一样传递,只需按照以下方式添加,如果它是包含参数的对象:

{ $set: blockFields } 因为代码应该是这样的

Block.updateOne(
  { _id: req.params.blockid },
  blockFields, // if blockfields is object containing parameters
  { new: true },
  (err, block) => {
    // lines of code
  }
);

更多详细信息,请参阅updateOne函数详细说明updateOne


blockFields是要更新的参数。{new:true}是输出mongoose结果的标志,但它没有显示新结果。我将编辑描述。 - jmrueda
好的,如果“blockFields”本身包含参数,则不要将其写成我正在更新我的解决方案,请检查它。 - Muhammad Aadil Banaras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接