如何基于现有值更新MongoDB文档中的数组(实现字符串拼接)
MongoDB数组元素批量追加字符串的正确实现
问题场景
原始文档结构:
{ "_id": { "$oid": "44163fdce26d651e230e5f7" }, "views": { "cardView": { "listOptions": { "addViewKey": null, "editViewKey": null, "listSortFieldKeys": [ "Name", "Element" ] } } } }
需求是将listSortFieldKeys数组中的每个元素追加_test,最终得到:
"listSortFieldKeys": [ "Name_test", "Element_test" ]
尝试执行以下updateMany操作时触发错误:
db.getCollection("entityInfos") .updateMany({ 'views.cardView.listOptions.listSortFieldKeys': { $exists: true, $ne: null }}, [{ $set: { "views.cardView.listOptions.listSortFieldKeys.$[]": { $concat: ['views.cardView.listOptions.listSortFieldKeys.$[]', '_test'] } }}])
错误提示(翻译后):
无效的$set :: 原因是 :: FieldPath字段名称不能以'$'开头。考虑使用$getField或$setField。
错误原因
原代码错误地将数组更新操作符$[]直接用于聚合表达式的$concat参数中。$[]是用于更新数组所有元素的位置操作符,不能在聚合管道的字段引用中使用,聚合处理数组需要通过$map这类数组遍历操作符来逐个处理元素。
正确实现代码
使用聚合管道结合$map来遍历并修改数组元素,完整代码如下:
db.getCollection("entityInfos").updateMany( { 'views.cardView.listOptions.listSortFieldKeys': { $exists: true, $ne: null } }, [ { $set: { "views.cardView.listOptions.listSortFieldKeys": { $map: { input: "$views.cardView.listOptions.listSortFieldKeys", as: "item", in: { $concat: ["$$item", "_test"] } } } } } ] )
代码说明
- 匹配条件:保持原有的判断,只更新存在且非空的
listSortFieldKeys数组的文档 - $map遍历数组:通过
$map遍历目标数组,将每个元素赋值给临时变量$$item - $concat拼接字符串:对每个
$$item执行$concat操作,追加_test - $set赋值:将处理后的新数组重新赋值给原字段,完成批量更新
内容的提问来源于stack exchange,提问作者user1662275
相关产品推荐
相关产品推荐

