代码之家  ›  专栏  ›  技术社区  ›  Ayoub k

如何将查询转换为使用regex而不是equal

  •  0
  • Ayoub k  · 技术社区  · 6 年前

    我正在使用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},
        ]
    }
    


    因此,我有一个工作查询:

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

    但是我现在想检查年龄是否包含像“2”这样的值。我需要使用正则表达式。是否有方法将该查询转换为使用regex inside/而不是 $eq
    PS:我不想使用聚合,因为我使用的是旧版本。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Ashh    6 年前

    你可以用 $indexOfCP

    db.collection.find({
      "$expr": {
        "$ne": [
          {
            "$indexOfCP": [
              { "$toLower": {
                "$let": {
                  "vars": {
                    "beforeLast": {
                      "$arrayElemAt": [
                        "$status",
                        -2
                      ]
                    }
                  },
                  "in": "$$beforeLast.age"
                }
              }},
              "2"
            ]
          },
          -1
        ]
      }
    })
    
        2
  •  0
  •   Ashwanth Madhav    6 年前

    尝试聚合

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