Hi David,
I created an example of a simple one criteria query with an index and documented its behaviour below showing how you can use the same index to sort the results either for ascending or descending ordering. Is this what you mean by a simple query ?
Taking a sample document with fields 'age' in a collection 'test' and querying it on age with an index on this field and sorting it on 'age'.
i)
{code:js}
for (i=0; i<10000; i++) {db.test.insert({"age":Math.floor(Math.random()*120)});}
{code}
ii) {code:js}
db.test.ensureIndex({"age": 1})
{code}
iii) a) age sorted descending query {code:js}
db.test.find({"age": 25}).sort("age": -1).limit(5)
{ "_id" : ObjectId("52c6ccdf70aa401c79ba8965"), "age" : 25 }
{ "_id" : ObjectId("52c6ccdf70aa401c79ba88ca"), "age" : 25 }
{ "_id" : ObjectId("52c6ccdf70aa401c79ba8868"), "age" : 25 }
{ "_id" : ObjectId("52c6ccdf70aa401c79ba87a2"), "age" : 25 }
{ "_id" : ObjectId("52c6ccdf70aa401c79ba86e4"), "age" : 25 }
{code}
iii) b) age sorted ascending query {code:js}
db.test.find({"age": 25}).sort("age": 1).limit(5)
{ "_id" : ObjectId("52c6ccdd70aa401c79ba643a"), "age" : 25 }
{ "_id" : ObjectId("52c6ccdd70aa401c79ba64d2"), "age" : 25 }
{ "_id" : ObjectId("52c6ccdd70aa401c79ba6531"), "age" : 25 }
{ "_id" : ObjectId("52c6ccdd70aa401c79ba661f"), "age" : 25 }
{ "_id" : ObjectId("52c6ccdd70aa401c79ba6631"), "age" : 25 }
{code}
In MongoDB when you do not include a sort criteria then the ordering of the results is undefined. It is not possible to specify a $natural sort in an index as when you specify the $natural option for a query then no index will be used.
The ticket
https://jira.mongodb.org/browse/SERVER-5672 highlights that the use of $natural forces the database to do a table scan to return the documents in the order they are on disk. You should not $natural for your queries, the answer to ticket (SERVER-5672) is to use a query with an index which returns the duplicates in their disk order.
1) The resulting order on disk cannot be guaranteed to be natural order since documents can grow in size once updated or they can be deleted/removed and therefore can be moved around on the disk creating space for new documents. This is somewhat related to your 4th question below.
3) MongoDB can traverse an index in either direction. This will not have any performance issues for a simple index. A further tip is to put a sort() call before a limit() call when querying to reduce the scanning of your index.
4) here is a good overview of how the query optimiser chooses the index to use in a query in the documentation (
http://docs.mongodb.org/manual/core/query-plans/#read-operations-query-optimization). The reason you are not seeing this behaviour in capped collections is that the records are of a fixed size so they do not move around the disk (see answer 1) as documents cannot be removed, deleted or increase in size within a capped collection (note: they can age-out).
5) This behaviour is independent of whether or not you shard your collection. You can use explain() with sharding to see how the query is processed across shards. The natural order of a query on a shard will depend on your shard key strategy and your data distribution. In essence, MongoS will route your query to the database contain that portion of the data and it will be queried on the database as normal (see question 4).
Hope this answers your questions!