Hi Erich,
sorry for the delay!
You are correct, the best way to get efficient updates is to hand-tune your queries. Yes, it is painful to do all this by hand. Especially without optimistic locking (although Spring Data does provide an @Version annotation with the same semantics as the JPA version).
One tactic to consider is, are you trying to update an integer field? It's very efficient to use the $inc operator.
Another idea: if you are only updating a single document, you might decrease the chance of trying to save a stale copy by using findAndModify instead:
Another tactic is, are you trying to update embedded documents or even entries in an array? You could break these documents out into a separate collection using a parent id and update them individually (advantage: now former array items or embedded documents can be updated separately, instead of each update affecting the serialized state of the parent object). Using this tactic, you either query for child items directly or override the find method to repopulate the parent object with the child objects when you retrieve the parent object.
If you're working with time series data, this is a very helpful blog post:
For specific advice on best practices and strategies for updating documents, I recommend the general MongoDB user forum:
(Although of course I am happy to help you with any Salat specific issues!)
Please let me know how this turns out for you.
Best,
Rose