MongoDB:在聚合管道中使用字符串操作
Posted
技术标签:
【中文标题】MongoDB:在聚合管道中使用字符串操作【英文标题】:MongoDB : use string manipulation in aggregation pipeline 【发布时间】:2021-01-13 21:45:36 【问题描述】:我有一个用 NestJS 最新构建的小应用程序,我正在使用 Mongoose v5。
我已经在数据库中填写了 500 多个工作参考。 我用聚合管道编写了一个搜索函数来匹配我集合中的正确元素:
const query = await this.jobsModel.aggregate([
$match : name: $regex: jobName, $options: 'i' ,
$project : id:1, name:1, familyId:1, familyColor:1, svgListIcon:1, _id:1,
$addFields : searchName : this.createSearchName('$name') ,
$sort : 'name': 1 ,
])
return query;
我想解析每个 $name 字段以使用正则表达式并替换 $name 字段中的所有 \r\n :
createSearchName(jobName)
return jobName.replace(/\r\n/," ");
不幸的是,这不起作用,因为 .replace() 不采用 jobName 参数,并且仅使用 '$name'...
实现此操作的正确方法是什么?
我需要做 1 个查询,解析结果,然后做一个聚合管道吗?
【问题讨论】:
如果您使用的是 MongoDB 4.4,那么您可以使用 new 聚合运算符replaceAll。 太棒了...非常感谢!刚刚从 4.2 更新到 4.4,这个运算符正是我想要做的!祝你有美好的一天:) 你可以回答,我会接受的。 我无法访问 4.4。您可以发布解决方案。 【参考方案1】:感谢@prasad_,我将 MongoDB 从 4.2 更新到 4.4,并且我正在使用新的运算符 replaceAll。 该运算符在查询中用作 .replace()。
这是我的新聚合管道:
const query = await this.jobsModel.aggregate([
$match : name: $regex: jobName, $options: 'i' ,
$project : id:1, name:1, familyId:1, familyColor:1, svgListIcon:1, _id:1,
$addFields : searchName : $replaceAll: input: '$name', find: '\r\n', replacement: ' ' ,
$sort : 'searchName': 1
]);
【讨论】:
以上是关于MongoDB:在聚合管道中使用字符串操作的主要内容,如果未能解决你的问题,请参考以下文章