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:在聚合管道中使用字符串操作的主要内容,如果未能解决你的问题,请参考以下文章

《MongoDB入门教程》第22篇 聚合操作

《MongoDB入门教程》第22篇 聚合操作

mongodb Aggregation聚合操作之$facet

如何设置字符串字段不等于空字符串MongoDB聚合管道

翻译MongoDB指南/聚合——聚合管道

MongoDB——聚合管道之$match和$count操作