programing

정수 값에 대한 MongoDB 정규식 검색

stoneblock 2023. 7. 13. 20:21

정수 값에 대한 MongoDB 정규식 검색

MongoDB에서 정수 값을 정규식으로 검색하고 싶습니다.이것이 가능합니까?

저는 다양한 필드에서 와일드카드 *를 허용하는 CRUD 타입 인터페이스를 구축하고 있습니다.나는 정수인 몇 개의 필드에 대해 UI를 일관되게 유지하려고 합니다.

고려 사항:

> db.seDemo.insert({ "example" : 1234 });
> db.seDemo.find({ "example" : 1234 });
{ "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 }
> db.seDemo.find({ "example" : /^123.*/ });
> 

보시다시피, 저는 어떤 물체를 삽입하고 그 값으로 그것을 찾을 수 있습니다.단순한 정규식을 시도해보면, 실제로 그 물체를 찾을 수 없습니다.

감사합니다!

만약 당신이 숫자에 패턴 매치를 하고 싶다면, mongo에서 하는 방법은 $where 표현을 사용하고 패턴 매치를 통과하는 것입니다.

> db.test.find({ $where: "/^123.*/.test(this.example)" })
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 }

나는 쿼리 연산자를 사용하는 것을 좋아하지 않습니다. 쿼리 표현식을 평가하는 방식 때문에 쿼리가 사용자 입력 데이터를 사용하는 경우 인덱스와 보안 위험을 사용하지 않기 때문입니다.

MongoDB 4.2부터는 다음을 사용할 수 있습니다.$regexMatch|$regexFind|$regexFindAllMongoDB 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부터 특정 하위 문자열이 포함된 모든 문서를 검색하려는 경우 반복 논리 처리를 허용하는 연산자를 사용할 수 있습니다.$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 이전 버전에서는 문서에 추가하고 번호의 문자열 값인 다른 계산 필드를 추가해야 합니다.

와 형제 연산자는 문자열을 각각 소문자와 대문자로 변환하지만 정수를 문자열로 변환하는 데 사용할 수 있다는 약간의 알 수 없는 기능이 있습니다.

오퍼레이터는 오퍼레이터를 사용하여 패턴과 일치하는 모든 문서를 반환합니다.

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의 다음 릴리스입니다.$indexOfCP.

db.seDemo.aggregate([ 
    { "$redact": { 
        "$cond": [ 
            { "$gt": [ 
                { "$indexOfCP": [ 
                    { "$toLower": "$example" }, 
                    "123" 
                ] }, 
                -1 
            ] }, 
            "$$KEEP", 
            "$$PRUNE" 
        ] 
    }}
])

언급URL : https://stackoverflow.com/questions/2908100/mongodb-regex-search-on-integer-value