I think the mongos will query the slave if you do not request it to only query the master.
So if you create your MongoClient instance (to talk to mongos) like this:
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
...
builder.readPreference(ReadPreference.nearest()); // not the primary
...
MongoClientOptions clientOptions = builder.build();
mongoClient = new MongoClient(serverAddr, clientOptions);
I think you actually don't need to worry about it. The mongos will wisely choose a right mongod in a determined shard. (Actually, our DBA tell me he see the query to the slave mongod)
This opition is passed to mongos through the "flags" value in the OP_QUERY struct. I debugged into the mongodb java drive, see the value is 4 --- which means "SlaveOK" bit is set. Please see: http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/?pageVersion=106#op-query for more detail.