Mongodb Regex Поиск по целым цене
-
04-10-2019 - |
Вопрос
Я хочу регулировать целочисленное значение в MongoDB. Это возможно?
Я создаю интерфейс типа Crud, который позволяет * для подстановочных знаков на различных полях. Я пытаюсь сохранить UI постоянно для нескольких полей, которые являются целыми числами.
Рассмотреть возможность:
> db.seDemo.insert({ "example" : 1234 });
> db.seDemo.find({ "example" : 1234 });
{ "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 }
> db.seDemo.find({ "example" : /^123.*/ });
>
Как видите, я вставляю объект, и я могу найти его по значению. Если я попробую простое регез, я не могу найти объект.
Спасибо!
Решение
Если вы хотите сделать шаблон сопоставления по номерам, способ сделать это в Mongo, использует $, где выражение и пропуск в шаблоне.
> db.test.find({ $where: "/^123.*/.test(this.example)" })
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 }
Другие советы
Я не большой поклонник использования $where
Оператор запроса из-за того, как он оценивает выражение запроса, он не использует индексы и риск безопасности, если запрос использует данные ввода пользователя.
Начиная с MongoDB 4.2 Вы можете использовать $regexMatch|$regexFind|$regexFindAll
Доступно в MongoDB 4.1.9+ и $expr
сделать это.
let regex = /123/;
$regexMatch
а также$regexFind
db.col.find({ "$expr": { "$regexMatch": { "input": {"$toString": "$name"}, "regex": /123/ } } })
$regexFinAll
db.col.find({ "$expr": { "$gt": [ { "$size": { "$regexFindAll": { "input": {"$toString": "$name"}, "regex": "123" } } }, 0 ] } })
От MongoDB 4.0 вы можете использовать $toString
оператор, который является оберткой вокруг $convert
оператор к строить целые числа.
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toString": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])
Если то, что вы хотите, это извлекать весь документ, который содержит определенную подстроку, начиная с выпуска 3.4, вы можете использовать $redact
оператор, который позволяет $cond
ИТАЛЬНАЯ ЛОГИЧЕСКАЯ ОБРАБОТКА.$indexOfCP
.
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toLower": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])
который производит:
{
"_id" : ObjectId("579c668c1c52188b56a235b7"),
"example" : 1234
}
{
"_id" : ObjectId("579c66971c52188b56a235b9"),
"example" : 12334
}
До MongoDB 3.4, вам нужно $project
Ваш документ и добавьте другое вычисленное поле, которое является строковым значением вашего номера.
То $toLower
и его брат $toUpper
Операторы соответственно преобразуют строку в строчные и прописные буквы, но у них есть небольшая неизвестная функция, которая заключается в том, что они могут быть использованы для преобразования целого числа для строки.
То $match
Оператор возвращает все эти документы, которые соответствуют вашему шаблону, используя $regex
оператор.
db.seDemo.aggregate(
[
{ "$project": {
"stringifyExample": { "$toLower": "$example" },
"example": 1
}},
{ "$match": { "stringifyExample": /^123.*/ } }
]
)
который дает:
{
"_id" : ObjectId("579c668c1c52188b56a235b7"),
"example" : 1234,
"stringifyExample" : "1234"
}
{
"_id" : ObjectId("579c66971c52188b56a235b9"),
"example" : 12334,
"stringifyExample" : "12334"
}
Теперь, если то, что вы хотите, это извлекать весь документ, который содержит определенную подстроку, тем легче и лучший способ сделать это в предстоящем выпуске MongoDB (поскольку это написание), используя $redact
оператор, который позволяет $cond
ИТАЛЬНАЯ ЛОГИЧЕСКАЯ ОБРАБОТКА.$indexOfCP
.
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toLower": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])