파이몬고 커서에 쿼리 결과가 있는지 확인하는 방법
는 제가확야할것이봐가 있는지 해야 합니다.find
문이 비어 있지 않은 쿼리를 반환합니다.
제가 하고 있는 일은 다음과 같습니다.
query = collection.find({"string": field})
if not query: #do something
그리고 나는 깨달았다 나의if
은 다음과다문같은않실았니습행지되이이유로 때문에 .find
쿼리가 비어 있거나 비어 있지 않은 커서를 반환합니다.
따라서 설명서를 확인한 결과 도움이 될 수 있는 두 가지 방법을 발견했습니다.
count(with_limit_and_skip=False)
다음 중 어느 것(설명에서):이 쿼리에 대해 설정된 결과의 문서 수를 반환합니다.
확인하기 좋은 방법인 것 같지만, 이것은 커서에 있는 모든 결과를 세어봐야 0인지 아닌지 알 수 있다는 것을 의미합니다.조금 비싸다고요?
retrieved
다음 중 어느 것(설명에서):지금까지 검색된 문서 수입니다.
빈 쿼리 세트에서 테스트해보니 0이 반환되지만, 어떤 기능을 하는지 명확하지 않고 저에게 맞는지 모르겠습니다.
따라서, 다음 중 어느 것이 가장 적합한지 확인할 수 있는 최선의 방법(모범 사례)입니다.find()
query는 빈 집합을 반환합니까?위에서 설명한 방법 중 하나가 이 목적에 적합합니까?그리고 성능은 어떻습니까?다른 방법이 있습니까?
분명히 해야 할 것은쿼리가 비어 있는지 알아야 하며 성능과 파이썬성 측면에서 커서를 사용하여 가장 좋은 방법을 찾고 싶습니다.
편집: 2014년에는 이것이 사실이었지만, 현대 버전의 Pymongo 및 MongoDB는 이러한 행동을 변화시켰습니다. 구매자 주의:
.count()
쿼리에서 반환되는 결과 수를 찾는 올바른 방법입니다. 그count()
하게 할 수 ..count()
결과 집합의 항목을 반복하기 전에 확인합니다.
MongoDB 2.4에서는 카운트 방식의 성능이 크게 향상되었습니다.당신의 속도를 늦출 수 있는 유일한 것.count
쿼리에 인덱스가 설정되어 있는지 여부를 나타냅니다.와 같은 것을 할 수 .
query = collection.find({"string": field})
print query.explain()
보이면,BasicCursor
결과적으로, 당신은 당신의 색인이 필요합니다.string
필드를 입력합니다.
편집: @alvapan이 지적했듯이, Pymongo는 Pymongo 3.7+에서 이 방법을 사용하지 않고 이제 사용하기를 선호합니다.count_documents
별도의 조회로
item_count = collection.count_documents({"string": field})
은 쿼에서반수계올방바은법른는을 입니다..retreived
쿼리를 반복한 후 또는 에 카운터합니다.enumerate
우선 쿼리:
# Using .retrieved
query = collection.find({"string": field})
for item in query:
print(item)
print('Located {0:,} item(s)'.format(query.retrieved))
또는 다른 방법:
# Using the built-in enumerate
query = collection.find({"string": field})
for index, item in enumerate(query):
print(item)
print('Located {0:,} item(s)'.format(index+1))
그냥 사용하는 게 어때요?find_one
대신에find
그러면 그냥 결과가 나왔는지 확인할 수 있습니다.None
그리고 만약 "string"이 색인화되었다면, 당신은 통과할 수 있습니다.fields = {"string":1, "_id" :0}
인덱스 전용 쿼리로 만드는 것이 훨씬 더 빠릅니다.
또 다른 해결책은 커서를 목록으로 변환하는 것입니다. 커서에 데이터가 없으면 빈 목록에 모든 데이터가 포함됩니다.
doc_list = collection.find({}); #find all data
have_list = True if len(list(doc_list)) else False;
내 테스트에 따르면, 가장 빠른 방법은
if query.first():
# do something
In [51]: %timeit query = MyMongoDoc.objects(); query.first()
100 loops, best of 3: 2.12 ms per loop
In [52]: %timeit query = MyMongoDoc.objects(); query.count()
100 loops, best of 3: 4.28 ms per loop
(MongoDB 2.6.7, 2015-03-26 사용)
언급URL : https://stackoverflow.com/questions/26549787/how-to-check-if-a-pymongo-cursor-has-query-results
'programing' 카테고리의 다른 글
Spring data MongoDb: MappingMongoConverter remove_class (0) | 2023.06.02 |
---|---|
릴리스 또는 디버그 모드인지 탐지하려면 어떻게 해야 합니까? (0) | 2023.06.02 |
관계에 대한 사용 권한이 거부되었습니다. (0) | 2023.06.02 |
좋은 .NET 프로파일러는 무엇입니까? (0) | 2023.06.02 |
Android에서 토스트를 표시하는 방법은 무엇입니까? (0) | 2023.06.02 |