javascript - Mongoose 更新子文档数组对象

标签 javascript mongodb mongoose

我想通过父 ID 和子文档对象 ID 使用 findByIdAndUpdate 更新子文档数组的一个对象。执行此代码时,我收到此错误:

The positional operator did not find the match needed from the query.

当我将 updateOne 与过滤器参数一起使用时,它可以工作。但我希望更新后的文档以 json 形式返回给 REST API。

有什么办法可以获取更新后的文档吗?

我的代码:

Subject.findByIdAndUpdate(
  { _id: req.params.subjectId, "bookmarks._id": req.params.bookmarkId },
  {
    $set: {
      "bookmarks.$.uri": req.body.uri
    }
  },
  { new: true }
)

架构:

{
    "_id": "5e7fbfc05ff6be1446b51af7",
    "user_id": "5e7e68c3fd5e9404ce6a14a3",
    "title": "Hello World",
    "date": "2020-03-28T21:21:04.434Z",
    "bookmarks": [
        {
            "date": "2020-03-28T21:21:20.806Z",
            "_id": "5e7fbfd05ff6be1446b51afa",
            "uri": "lorem ipsum"
        },
        {
            "date": "2020-03-28T21:21:21.433Z",
            "_id": "5e7fbfd15ff6be1446b51afb",
            "uri": "lorem ipsum"
        }
    ]
}

最佳答案

您应该使用.findOneAndUpdate() :

由于您的 req.params.subjectIdreq.params.bookmarkId 是字符串,数据库中的相应字段将为 ObjectId() 类型code> - 因此使用以下代码将字符串转换为 ObjectId() :

const mongoose = require('mongoose');
const _id = mongoose.Types.ObjectId(req.params.subjectId);
const bookmarkId = mongoose.Types.ObjectId(req.params.bookmarkId);

Subject.findOneAndUpdate(
  { _id: _id, "bookmarks._id": bookmarkId },
  {
    $set: {
      "bookmarks.$.uri": 'new new'
    }
  },
  { new: true }
)

您的问题应该是 mongoose 的 .findByIdAndUpdate() 确实只接受一个字符串值并在内部将其转换为 {_id : ObjectId(req.params.subjectId)}使用 .findOneAndUpdate(),它只是一种包装器。

关于javascript - Mongoose 更新子文档数组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60907246/

相关文章:

javascript - NodeJS : How to handle a variable number of callbacks run in parallel and map their responses to requests?

javascript - 将棱镜添加到summernote

javascript - 打开div并关闭其他

javascript - 将文档插入数据库之前的 MongoDB 空集合

javascript - 在 Mongoose 中使用 Multer 将文件存储到 MongoDB

javascript - jQuery tmpl 和 DataLink 测试版

javascript - 无法在 Mongoose 回调中保存

javascript - Node.js 与 MongoDB 驱动程序 - 尝试使用键周围的引号获取有效的 JSON 输出

node.js - MongoDB Aggregate - 如何使用前一阶段的值作为下一阶段的字段名称?

mongodb - 在 mongodb 中执行三个集合的连接?