MongoDB:在聚合管道中使用字符串操作

时间:2020-09-28 10:00:08

标签: regex mongodb mongoose mongodb-query aggregation-framework

我有一个最新的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个查询,解析结果,然后执行聚合管道吗?

1 个答案:

答案 0 :(得分:0)

由于@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 }}
]);
相关问题