【问题标题】:MongoDB : use string manipulation in aggregation pipelineMongoDB:在聚合管道中使用字符串操作
【发布时间】: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。您可以发布解决方案。

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


【解决方案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 }}
]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2019-11-29
    • 2023-04-04
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多