Sometimes I only need the user data, some times with his books data and sometimes with groups data. Do I implement a method for each of the usecases ?
It's certainly possible.
One of the interesting approaches to consider is CQRS, which creates an explicit separation between "designs we use to change information" and "designs we use to report information".
For changes, we certainly want to load information into representations that can be used to ensure that the invariant of our domain dynamics is maintained.
For reports, though, that's not nearly as important. In fact, it is often the case that (for reporting) we need only a slice of the information used in our domain logic, not the entire graph of information. In which case, it makes sense that we would have a different protocol for converting a query protocol into an interesting and useful data structure.
Furthermore, your reads and your writes might not need to be using common information at all - it might be better to generate your reports from cached copies of information (trading away some data freshness in exchange for lower latency, for example).
Part of the point of REPOSITORY is that it acts as an encapsulation boundary, decoupling the plumbing of information management from the components in your solution that just don't care.
And how to abstract updates? If I am using MongoDB then I have $inc, $pull and other awesome operators.
Choose the appropriate layer of abstraction.
If mongo, or mongo like, capabilities are a necessary constraint on your choice of persistent storage, then being able to detect this from the repository interface is a good thing.
If those capabilities only show up in a few code paths, then it is likely that you will have multiple methods available - a set of methods for those paths that don't need the extra power that you get from mongo, and another set of methods for those paths that do.