我想通过父 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.subjectId
和 req.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/