【问题标题】:Moongoose update subdocument array objectMongoose 更新子文档数组对象
【发布时间】:2020-03-29 07:10:12
【问题描述】:

我想通过父 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"
        }
    ]
}

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

    你应该使用.findOneAndUpdate():

    由于您的 req.params.subjectId 和 req.params.bookmarkId 是字符串,并且您的数据库中的相应字段将是 ObjectId() 类型 - 所以使用以下代码将字符串转换为 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 }
    )
    

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

    【讨论】:

    • 谢谢,现在可以了。它也可以处理字符串,但为了安全起见,我采用您将查询的字符串转换为对象 ID 的想法。 :)
    • @mnlfischer :不,如果您的数据库将这些字段作为字符串,则不必将字符串转换为 ObjectId(),转换就是要确保类型匹配..
    • 经过一番研究,我将使用 mongoose.Types.ObjectId.isValid(subjectId) 检查传递的参数是否是有效的对象 ID。我没有明确定义 id,因此我为每个主题获得了一个自动生成的对象 id。感谢您分享您的想法!
    猜你喜欢
    • 2021-01-10
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2020-06-07
    • 2019-03-25
    • 2020-05-01
    • 2014-11-03
    相关资源
    最近更新 更多