В MongoDB v 4.2
- вы можете использовать $ let & $ regexFind для этого:
db.collection.aggregate([
{
$match: {
$expr: {
$eq: [
{
$let: {
vars: {
value: {
$regexFind: {
input: "971524500000", // pass in as string
regex: { $toString: "$callingCode" }
}
}
},
in: "$$value.idx",
}
},
0
]
}
}
}
]);
Тест: MongoDB-Playground
Объяснение:
Общий вариант использования:
В общем регулярное выражение поиски - будет иметь ввод, который будет подстрокой фактической строки, Пример: -
Фактическая строка в БД: 'Мы можем сделать это в пн go '
Ввод: пн go (/mongo/
- будет работать)
Ваш вариант использования:
Сверху, так как mongo
существует в фактической строке / значении поля дб, тогда вы можете получить этот документ, но ваш случай другой:
Фактическая строка в БД: mon go
Ввод: 'Мы можем сделать это в понедельник go'
Это не сработает, поэтому использование обычного /We can do it in mongo/
isn ' Тебе здесь помочь (также делаю несколько трюков с регулярным выражением). Поэтому нам нужно сделать трюк с оператором $regexFind
. В отличие от документации mon go нам нужно взять 971524500000
в input
field & regex как строковое значение поля callingCode
, которое противоположно тому, что указано в документации.
Так что, как только мы это сделаем, Мы получили бы что-то вроде ниже:
{
"match" : "971", /** value of callingCode field */
"idx" : 0, /** Index of `971` in '971524500000' */
"captures" : []
},{
"match" : "1",
"idx" : 2,
"captures" : []
},
null /** 3rd doc no match */
Поскольку код страны должен быть в начале данного числа, нам нужны документы, где "idx" : 0
- поэтому мы используем $let
, чтобы получить индекс возвращенного объекта & проверка по 0
и, в конечном итоге, получение соответствующих документов с использованием $match
.
Примечание:
Есть что-то, что вам нужно изучить, на всякий случай, если вы ' Если у вас есть документы, подобные приведенным ниже:
{
"_id": ObjectId("5e8f67091aa1cc3d2158ade1"),
"name": "USA",
"callingCode": 1.0
},
{
"_id": ObjectId("5e8f67091aa1cc3d2158ade3"),
"name": "somecountry",
"callingCode": 197.0
}
& input - 1971524500000
, тогда этот запрос приведет к получению обоих документов. Это будет случай, когда вам нужно проверить. В любом случае, я бы посоветовал попробовать этот запрос, вместо того, чтобы пересылать все документы для сбора в код и извлекать необходимые данные, о / п. Это может быть лучше сделать.