We are using morphia 0.99 and java driver 2.7.3 I would like to learn is there any difference between fetching records one by one using fetch
and retrieving results by asList (assume that there is enough memory to retrieve records through asList
).
We iterate over a large collection, while using fetch
I sometimes encounter cursor not found exception
on the server during the fetch operation, so I need to execute another command to continue, what could be the reason for this?
1-)fetch the record
2-)do some calculation on it
3-)+save it back to database again
4-)fetch another record and repeat the steps until there isn't any more records.
So which one would be faster? Fetching records one by one or retrieving bulks of results using asList, or isn't there any difference between them using morphia implementation?
Thanks for the answers
Judging from the source-code, asList()
uses fetch()
and aggregates the results for you, so I can't see much difference between the two.
As far as I understand the implementation, fetch()
streams results from the DB while asList()
will load all query results into memory. So they will both get every object that matches the query, but asList()
will load them all into memory while fetch()
leaves it up to you.
For your use case, it neither would be faster in terms of CPU, but fetch()
should use less memory and not blow up in case you have a lot of DB records.
One very useful difference would be if the following two conditions applied to your scenario:
- You were using
offset
and limit
in the query.
- You were changing values on the object such that it would no longer be returned in the query.
So say you were doing a query on awesome=true
, and you were using offset
and limit
to do multiple queries, returning 100 records at a time to make sure you didn't use up too much memory. If, in your iteration loop, you set awesome=false
on an object and saved it, it would cause you to miss updating some records.
In a case like this, fetch()
would be a better approach.