Pymongo로 정규식 쿼리 수행


129

mongodb 서버에 대해 pymongo를 사용하여 정규식 쿼리를 수행하려고합니다. 문서 구조는 다음과 같습니다

{
  "files": [
    "File 1",
    "File 2",
    "File 3",
    "File 4"
  ],
  "rootFolder": "/Location/Of/Files"
}

패턴 * File과 일치하는 모든 파일을 가져오고 싶습니다. 나는 이것을 이렇게 시도했다.

db.collectionName.find({'files':'/^File/'})

그러나 나는 아무것도 돌려받지 못합니다. mongodb 문서에 따르면 이것이 가능해야하기 때문에 뭔가 빠졌습니다. mongo 콘솔에서 쿼리를 수행하면 정상적으로 작동합니다. 이것은 API가 지원하지 않거나 잘못 사용한다는 의미입니까?

답변:


191

정규식 옵션 (예 : 대소 문자 무시)을 포함 시키려면 다음을 시도하십시오.

import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})

8
또한 시작시 고정 된 정규 표현식 (예 :로 시작 ^)은 db에서 인덱스를 사용할 수 있으며이 경우 훨씬 빠르게 실행됩니다.
drevicko

1
^로 시작하는 정규 표현식은 특정 경우 에만 색인을 사용할 수 있습니다 . re.IGNORECASE를 사용할 때 mongo가 인덱스를 사용하여 쿼리를 수행 할 수 없다고 생각합니다.
nonagon

이 사용법은 어딘가에 기록되어 있습니까? 공식 pymongo API 문서에서 이것을 찾을 수 없습니다.
Hieu

153

pymongo에서는 정규식 검색이 약간 다르게 수행되지만 쉽지는 않습니다.

정규식은 다음과 같이 수행됩니다.

db.collectionname.find({'files':{'$regex':'^File'}})

파일로 시작하는 항목이있는 파일 속성이있는 모든 문서와 일치합니다.


9
실제로, 여기에있는 것은 또한 을 사용하는 경우 자바 스크립트 (및 아마도 다른 언어)에서도 수행 되는 방식$regex 입니다. @ 에릭의 대답은 조금 다른 파이썬 방식입니다.
drevicko

차이점이 뭐야? 둘 다 파이썬 pymongo를 사용하고 있습니까? mongodb 쿼리의 일부이므로 문제가 실제로 표시되지 않습니다.
Dexter

10
mongodb JScript의 정규식에서도 무시가 가능합니다. db.collectionname.find ({ 'files': { '$ regex': '^ File', '$ options': 'i'}})
Ajay Gupta

5
이 대답은 내 눈에 더 좋아 보인다. 몽고가 다시 컴파일 할 수 있도록 파이썬 RE를 컴파일하는 것이 귀찮은 이유는 무엇입니까? 몽고의 $regex연산자는 $options논쟁을한다.
Mark E. Haase

3
사용하십시오 r'^File'대신 '^File'다른 문제를 방지하기 위해
Aminah Nuraini

9

이중 컴파일을 피하기 위해 PyMongo와 함께 제공되는 bson 정규식 래퍼를 사용할 수 있습니다.

>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})

정규식은 문자열을 컴파일하지 않고 저장하므로 find_one은 인수를 '정규식'유형으로 감지하고 적절한 몽고 쿼리를 형성 할 수 있습니다.

나는이 방법이 다른 최고 답변보다 약간 Pythonic이라고 생각합니다.

>>> db.collectionname.find({'files':{'$regex':'^File'}})

약간의 경고가 있기 때문에 정규식 쿼리를 사용하려는 경우 bson Regex 설명서를 읽어보십시오.


1
$ in을 사용하여 배열을 다시 일치시켜야하는 경우 $ regex가 작동하지 않습니다. bson.regex.Regex 트릭을 할 것입니다!
odedfos

4

의 해결책은 re색인을 전혀 사용하지 않습니다. 다음과 같은 명령을 사용해야합니다.

db.collectionname.find({'files':{'$regex':'^File'}})

(답글 아래에 댓글을 달 수 없으므로 여기에 답장)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.