как конвертировать запрос, чтобы использовать регулярные выражения вместо равных - PullRequest
1 голос
/ 12 марта 2019

Я использую 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},
    ]
}

Я хочу проверить, имеет ли предыдущий последний объект в статусе, например, возраст = 29.
, поэтому для этого у меня естьэтот рабочий запрос:

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

, но сейчас я хочу проверить, например, есть ли в возрасте значение типа «2».Мне нужно использовать выражение регулярных выражений.В любом случае можно ли преобразовать этот запрос, чтобы использовать регулярное выражение внутри / вместо $eq оператора?
PS: я не хочу использовать агрегацию, потому что я работаю со старой версией.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Вы можете использовать $indexOfCP, чтобы найти подстроку внутри строкового символа

db.collection.find({
  "$expr": {
    "$ne": [
      {
        "$indexOfCP": [
          { "$toLower": {
            "$let": {
              "vars": {
                "beforeLast": {
                  "$arrayElemAt": [
                    "$status",
                    -2
                  ]
                }
              },
              "in": "$$beforeLast.age"
            }
          }},
          "2"
        ]
      },
      -1
    ]
  }
})
0 голосов
/ 12 марта 2019

Попробуйте с агрегацией

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