programing

파이몬고 커서에 쿼리 결과가 있는지 확인하는 방법

firstcheck 2023. 6. 2. 22:34
반응형

파이몬고 커서에 쿼리 결과가 있는지 확인하는 방법

는 제가확야할것이봐가 있는지 해야 합니다.find문이 비어 있지 않은 쿼리를 반환합니다.

제가 하고 있는 일은 다음과 같습니다.

query = collection.find({"string": field})
if not query: #do something

그리고 나는 깨달았다 나의if은 다음과다문같은않실았니습행지되이이유로 때문에 .find쿼리가 비어 있거나 비어 있지 않은 커서를 반환합니다.

따라서 설명서를 확인한 결과 도움이 될 수 있는 두 가지 방법을 발견했습니다.

  1. count(with_limit_and_skip=False)다음 중 어느 것(설명에서):

    이 쿼리에 대해 설정된 결과의 문서 수를 반환합니다.

    확인하기 좋은 방법인 것 같지만, 이것은 커서에 있는 모든 결과를 세어봐야 0인지 아닌지 알 수 있다는 것을 의미합니다.조금 비싸다고요?

  2. retrieved다음 중 어느 것(설명에서):

    지금까지 검색된 문서 수입니다.

    빈 쿼리 세트에서 테스트해보니 0이 반환되지만, 어떤 기능을 하는지 명확하지 않고 저에게 맞는지 모르겠습니다.

따라서, 다음 중 어느 것이 가장 적합한지 확인할 수 있는 최선의 방법(모범 사례)입니다.find()query는 빈 집합을 반환합니까?위에서 설명한 방법 중 하나가 이 목적에 적합합니까?그리고 성능은 어떻습니까?다른 방법이 있습니까?


분명히 해야 할 것은쿼리가 비어 있는지 알아야 하며 성능과 파이썬성 측면에서 커서를 사용하여 가장 좋은 방법을 찾고 싶습니다.

편집: 2014년에는 이것이 사실이었지만, 현대 버전의 PymongoMongoDB는 이러한 행동을 변화시켰습니다. 구매자 주의:

.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

반응형