我有以下架构。
{
posts: [
{
_id: '5ayuunbdsyuuuyut778'
replies: [{
_id: "67hfudj7e9whduu888",
text: "something"
}]
}
]
}
我想更新特别回复的文字。 我在用猫鼬。
我写的查询如下
Post.findOneAndUpdate(
{'posts.replies._id': _id},
{$set: {'posts.$[post].replies.$[reply].text': "something1"}},
{ arrayFilters: [{'post._id': postId}, { 'reply._id': _id }]}
)
此查询不会更新文档。
我想念什么吗?我是否需要使用ObjectId投射ID
答案 0 :(得分:1)
您需要使用new: true
来获取更新后的值,并将id强制转换为mongoose objectId才能使其正常工作
Post.findOneAndUpdate(
{ 'posts.replies._id': _id },
{ $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
{ arrayFilters: [{ 'post._id': postId }, { 'reply._id': _id }], new: true }
)
答案 1 :(得分:0)
由于arrayFilters与mongodb相关,因此您需要使用ObjectId在mongoose中强制转换id
Post.findOneAndUpdate(
{ 'posts.replies._id': _id },
{ $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
{ arrayFilters: [{ 'post._id': postId }, { 'reply._id': _id }]}
)
必须更改为
Post.findOneAndUpdate(
{ 'posts.replies._id': _id },
{ $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
{ arrayFilters: [{ 'post._id': ObjectId(postId) }, { 'reply._id': ObjectId(_id)}]}
)
答案 2 :(得分:0)
arrayFilters 不接受字符串化的对象 ID,与 mongoose 中的典型过滤器(自动为您投射对象 ID)相反,您必须在将其作为过滤器传递给 arrayFilters 时手动投射对象 ID。
Post.findOneAndUpdate(
{ 'posts.replies._id': _id },
{ $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
{ arrayFilters: [{ 'post._id':new ObjectId(postId) }, { 'reply._id': new ObjectId(_id) }], new: true }
这行得通,查看评论here了解更多详情