質問

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を許可する演算子 $conditionalロジック処理。$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を許可する演算子 $conditionalロジック処理。$indexOfCP.

db.seDemo.aggregate([ 
    { "$redact": { 
        "$cond": [ 
            { "$gt": [ 
                { "$indexOfCP": [ 
                    { "$toLower": "$example" }, 
                    "123" 
                ] }, 
                -1 
            ] }, 
            "$$KEEP", 
            "$$PRUNE" 
        ] 
    }}
])
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top