$where
クエリ式を評価する方法、インデックスを使用しない、クエリがユーザー入力データを使用する場合のセキュリティリスクがあるため、私はクエリ演算子を使用するのが好きではありません。
MongoDB 4.2以降$regexMatch|$regexFind|$regexFindAll
では、MongoDB4.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"
}
さて、あなたが望むのが特定の部分文字列を含むすべてのドキュメントを取得することである場合、これを行うためのより簡単でより良い方法は、反復論理処理$redact
を可能にする演算子を使用するMongoDBの次のリリース(この記事の執筆時点)です。。$cond
$indexOfCP
db.seDemo.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$indexOfCP": [
{ "$toLower": "$example" },
"123"
] },
-1
] },
"$$KEEP",
"$$PRUNE"
]
}}
])