Improving concurrency in MongoDB via sharding
You are correct, with MongoDB the way to engineer around a write contention issue is to shard. 

Your environment sounds like it's fairly bursty, in that you're not continually ingesting data and instead ingesting it in fairly discrete chunks. With this in mind, you could go with a collector/distributor model such as this:

     ------&gt;{ workers }&lt;------
     |                       |
[Shard01]               [Shard02]
    |                      |
    ----&gt;[Persistant]&lt;------


The workers would upsert/push their results into the sharded collection/database, and once the job was completed a batch-process then uses something like db.copyDatabases() to push the result set at the monolithic (and cheaper to run) single instance Mongo. As the copy database process can push all of its updates in one run, it should experience much fewer write-lock problems.