请问下mongodb里怎么一句话更新notice字段里的子文档中notice_user=2时,is_read改为1
我自己弄的PHP程序
要先拿出notice_user的索引值,然后再array('$set' => array('notice.'.$index.'.is_read'=>1) 这样更新,,这样太难看了,我想一句话解决就好了。。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在 MongoDB 中,您可以使用 $[<identifier>]
过滤器结合数组更新操作符来实现对嵌套文档的直接更新,而无需先查询索引值。以下是针对您问题的具体解决方案:
假设您的文档结构如下:
{
"_id": ObjectId("..."),
"notice": [
{ "notice_user": 1, "is_read": 0 },
{ "notice_user": 2, "is_read": 0 },
{ "notice_user": 3, "is_read": 0 }
]
}
您可以使用以下 MongoDB 更新语句,直接将 notice_user=2
的子文档中的 is_read
字段更新为 1
:
db.collection.update(
{ "notice.notice_user": 2 }, // 查询条件:匹配 notice 数组中 notice_user=2 的文档
{
$set: { "notice.$[elem].is_read": 1 } // 更新操作:将匹配的子文档 is_read 设置为 1
},
{
arrayFilters: [{ "elem.notice_user": 2 }] // 定义过滤器:指定 elem.notice_user=2
}
)
查询条件:{ "notice.notice_user": 2 }
确保只更新包含 notice_user=2
的文档。
更新操作:$set: { "notice.$[elem].is_read": 1 }
使用 $[<identifier>]
过滤器定位到 notice
数组中符合条件的子文档,并将其 is_read
字段设置为 1
。
过滤器定义:arrayFilters: [{ "elem.notice_user": 2 }]
定义 elem
为数组中满足 notice_user=2
的元素。
在 PHP 中,您可以使用 MongoDB 驱动程序执行上述更新操作。代码示例如下:
$filter = ['notice.notice_user' => 2];
$update = [
'$set' => ['notice.$[elem].is_read' => 1]
];
$options = [
'arrayFilters' => [['elem.notice_user' => 2]]
];
$result = $collection->updateOne($filter, $update, $options);
notice.notice_user
字段上有索引,以提高查询效率。$[<identifier>]
是 MongoDB 3.6 及以上版本支持的功能,请确认您的 MongoDB 版本符合要求。notice
数组中可能存在多个 notice_user=2
的子文档,上述语句会同时更新所有匹配项。通过这种方式,您可以避免先查询索引值再更新的操作,实现更简洁、高效的更新逻辑。