问题
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