What happens to a pymongo cursor when all its elements have been iterated?

无人久伴 提交于 2019-12-11 03:27:07

问题


I wanted to use pymongo to get an array of entries from my database. It seems to return a "cursor" instead. I don't know what that is.

    all_nodes = pymongo.MongoClient("mongodb://localhost")["provemath"]["nodes"].find(None)

    print('ALL NODES')
    for node in all_nodes:
        print(node)

    print('STILL NODES')
    for node in all_nodes:
        print(node)

There output is:

ALL NODES
{'_notes': [], '_examples': [], '_type': 'definition', '_plural': None, '_counterexamples': [], '_intuitions': [], '_id': 'unique', '_importance': 4, '_name': 'unique', '_dependencies': [], '_description': 'An occurence of a property is __unique__ if the property occurs exactly $1$ time.'}
{'_notes': ['Vertices are often drawn as a dot.  They are also called *nodes*.'], '_examples': [], '_type': 'definition', '_plural': '__vertices__', '_counterexamples': [], '_intuitions': [], '_id': 'vertex', '_importance': 4, '_name': 'vertex', '_dependencies': ['unique'], '_description': 'A __vertex__ is a fundamental unit used to create graphs.'}
{'_notes': ['It is possible that $a=b$.'], '_examples': [], '_type': 'definition', '_plural': None, '_counterexamples': [], '_intuitions': ['Edges are usually drawn as a line or curve connecting two vertices.  In the case that $a=b$, the edge is drawn as a small loop that connects $a$ to itself.'], '_id': 'edge', '_importance': 4, '_name': 'edge', '_dependencies': ['unique', 'vertex'], '_description': 'An __edge__ is a set ${a,b}$ where $a$ and $b$ are vertices.'}
{'_notes': [], '_examples': [], '_type': 'definition', '_plural': None, '_counterexamples': [], '_intuitions': [], '_id': 'loop', '_importance': 4, '_name': 'loop', '_dependencies': [], '_description': 'A __loop__ is an edge $e = {a,a} = {a}$.'}
STILL NODES

Is a cursor only good for one use? (or is something else going on?) If I wanted regular array behavior, how would I get that?


回答1:


Yes. Cursor is only good for one use. As described in mongodb manual

By default, the server will automatically close the cursor after 10 minutes of inactivity or if client has exhausted the cursor.

To make you output as python list use

node_list = all_nodes[:]

or

node_list = [node for node in all_nodes] 

See also this question



来源:https://stackoverflow.com/questions/32100631/what-happens-to-a-pymongo-cursor-when-all-its-elements-have-been-iterated

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!