MongoDBは、整数値で検索します
-
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+およびTheで利用可能 $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
オペレーターに stringify 整数。
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toString": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])
あなたが望むものが、リリース3.4から始まる特定のサブストリングを含むすべてのドキュメントを取得することである場合、あなたは $redact
aを許可する演算子 $cond
itionalロジック処理。$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
aを許可する演算子 $cond
itionalロジック処理。$indexOfCP
.
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toLower": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])