как использовать $ regex внутри $ expr в агрегации mongodb - PullRequest
0 голосов
/ 28 апреля 2020

Мой do c выглядит следующим образом

doc = {
    name: 'abc',
    age:20
}

, и мой запрос выглядит как

{ $expr: {$and:[{ $gt:[ "$age",  10 ] },
                { $regex:["$name",'ab']}
               ]
          }
} }

Но он не работает, и я получаю ошибку

Нераспознанное выражение '$ regex'

Как я могу заставить его работать?

Мой оригинальный запрос выглядит так

db.orders.aggregate([{
$match: {}},
{$lookup: {
    from: "orders",
    let: {
        "customer_details": "$customerDetails"
    },
    pipeline: [
        {
            $match: {
                $expr: {
                        $and: [
                                { $or: [
                                                {
                                                $eq: ["$customerDetails.parentMobile","$$customer_details.parentMobile"]
                                                },
                                                {$eq: ["$customerDetails.studentMobile","$$customer_details.parentMobile"]
                                                },
                                                {$eq: ["$customerDetails.studentMobile","$$customer_details.parentMobile"]
                                                },
                                                {$eq: ["$customerDetails.studentMobile","$$customer_details.studentMobile"]
                                                }
                                            ]
                                        },
                                {$eq: ["$customerDetails.zipCode","$$customer_details.zipCode"]},
                                {$eq: ["$customerDetails.address","$$customer_details.address"]}
                        ]
                    }

            }
        }],
    as: "oldOrder"
}
}])

Я хочу использовать regex для соответствия address.

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Если ваша версия mongoDB 4.2, тогда вы можете использовать $regexMatch

, попробуйте

db.collection.find({
  $expr: {
    $and: [
      {
        $gt: [
          "$age",
          10
        ]
      },
      {
        $regexMatch: {
          input: "$name",
          regex: "ab"
        }
      }
    ]
  }
})

, отметьте Пн go Детская площадка

0 голосов
/ 28 апреля 2020

$regex - это оператор запроса, который нельзя использовать внутри $expr, поскольку он поддерживает только операторы конвейера агрегирования.

{
  "$expr": { "$gt": ["$age", 10] } ,
  "name": { "$regex": "ab" }
}

Если у вас есть mongodb 4.2 , вы можете использовать $regexMatch

{ "$expr": {
  "$and": [
    { "$gt": ["$age", 10] },
    {
      "$regexMatch": {
        "input": "$name",
        "regex": "ab", //Your text search here
        "options": "i",
      }
    }
  ]
}}
...