find() returns a cursor over every matching document, while findOne() returns the first matching document itself, or null when nothing matches.
A cursor is lazy. Documents load in batches as you iterate, so find() can walk a large result without holding it all in memory.
You can chain cursor methods onto find(), such as sort(), limit() and skip().
findOne() runs at once and returns a plain document, so it has no cursor methods to chain.
When several documents match, findOne() returns the first one it reaches. With a collection scan, that is the first in natural order, the order MongoDB stored them in. With an index scan, it is the first entry in the index.
Use findOne() to fetch one document by a unique field, and find() to read a list.