如何将查询转换为使用正则表达式而不是相等

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将查询转换为使用正则表达式而不是相等相关的知识,希望对你有一定的参考价值。

我正在使用MongoDB,我有以下记录:

{
    name: "a",
    status: [
        { age: 15, closed: true},
        { age: 38, closed: true},
        { age: 42, closed: false},
    ]
},
{
    name: "b",
    status: [
        { age: 29, closed: true},
        { age: 5, closed: false},
    ]
}

我想检查状态中的前一个对象是否具有例如age = 29。 所以我有这个工作查询:

db.col.find({
    $expr: {
        $eq: [
            29,
            {
                $let: {
                    vars: { beforeLast: { $arrayElemAt: [ "$status", -2 ] } },
                    in: "$$beforeLast.age"
                }
            }
        ]
    }
})

但我现在要检查例如年龄是否包含类似“2”的值。我需要使用正则表达式。无论如何转换该查询以使用正则表达式/而不是$eq运算符? PS:我不想使用聚合,因为我正在使用旧版本。

答案

您可以使用$indexOfCP查找字符串字符内的子字符串

db.collection.find({
  "$expr": {
    "$ne": [
      {
        "$indexOfCP": [
          { "$toLower": {
            "$let": {
              "vars": {
                "beforeLast": {
                  "$arrayElemAt": [
                    "$status",
                    -2
                  ]
                }
              },
              "in": "$$beforeLast.age"
            }
          }},
          "2"
        ]
      },
      -1
    ]
  }
})
另一答案

尝试聚合

db.collection.aggregate([
{
 $project:
  {
     last: { $arrayElemAt: [ "$status", -2 ] },
  }
},
{$addFields:{
  ageInString: { $substr: [ "$last.age", 0, 3 ] }
  }},
  {$match:{ageInString:{ $regex: '^2' }}}
])

以上是关于如何将查询转换为使用正则表达式而不是相等的主要内容,如果未能解决你的问题,请参考以下文章

将正则表达式匹配转换为字符串列表

如何将标准正则表达式转换为 php 正则表达式? [复制]

将 C# 正则表达式代码转换为 Java

Nifi JSON正则表达式

我将使用啥代码将类似 SQL 的表达式即时转换为正则表达式?

如何将 DFA 转换为正则表达式?