使用Meteor与MongoDB遍历并格式化数组字段的方法
解决MongoDB集合中Aliases数组带空格格式化展示的问题
这问题我之前做项目时也碰到过,直接输出数组的话,模板引擎默认会调用数组的toString()方法转成字符串,结果就是不带空格的逗号分隔形式。要改成你想要的带空格格式,有两种常用方案,看你更倾向在哪一层处理:
方案一:前端模板层面直接处理
不管你用的是Handlebars、Vue还是其他主流模板引擎,都可以直接在模板里调用数组的join()方法,指定分隔符为, (逗号加空格):
比如Handlebars模板写法:
<p>{{aliases.join(', ')}}</p>
Vue模板的写法类似:
<p>{{ aliases.join(', ') }}</p>
这样渲染后就能直接得到目标效果:
"Jim, Jimmy, Jimbo, Jamie"
方案二:MongoDB查询阶段预处理
如果你希望从数据库直接拿到格式化好的字符串,不用前端再处理,可以用MongoDB的聚合管道来转换:
适用于MongoDB 4.4及以上版本
可以直接用$join操作符一步到位:
db.people.aggregate([ { $project: { name: 1, formattedAliases: { $join: { input: "$aliases", delimiter: ", " } } } } ])
查询后每个文档会多出一个formattedAliases字段,值就是带空格的字符串,直接在模板里用{{formattedAliases}}即可。
适用于MongoDB 4.4以下版本
可以用$reduce来拼接字符串:
db.people.aggregate([ { $project: { name: 1, formattedAliases: { $reduce: { input: "$aliases", initialValue: "", in: { $cond: [ { $eq: ["$$value", ""] }, "$$this", { $concat: ["$$value", ", ", "$$this"] } ] } } } } } ])
这个逻辑是遍历数组,第一次直接取元素,之后每次把之前的结果加上, 和当前元素拼接,最终得到带空格的目标字符串。
内容的提问来源于stack exchange,提问作者Garrett Smith
相关产品推荐
相关产品推荐

