First, I want to mention that if you are talking about the $isolated special parameter (formerly named $atomic) it's not a good idea to use it for a number of reasons (and I hope it will be deprecated at some point).
The reason that a document can be encountered more than sometimes when a document is updated and it grows in size, it needs to be moved.
Imagine you are reading documents "a,b,c,d,e" (as a collection scan) and you've read through d when the batch you got is used up and the driver goes to the server for the next batch. Meanwhile someone updated "b" which causes it to outgrow its allocated space and be moved ... to the end of the collection. So your next batch is "e,b" - meaning the entire set you read was a,b,c,d,e,b - but the first time you read "b" it was before the change to it was made, and the second time you read it it was after the change.
When you iterate over documents they are not representing a single instant in time. This is one of subtle results of that fact.
Asya