Data in MongoDB has a dynamic schema. Collections do not enforce document structure. This
facilitates iterative development and polymorphism. Nevertheless,
collections often hold documents with highly homogeneous
structures. See Data Modeling Concepts for more information.

Determine the set of collections that you will need and the
indexes required to support your queries. With the exception of
the _id index, you must create all indexes explicitly: MongoDB
does not automatically create any indexes other than _id.

Ensure that your schema design supports your deployment type: if
you planning to use sharded clusters for
horizontal scaling, design your schema to include a strong shard
key. The shard key affects read and write performance by
determining how MongoDB partitions data. See: Impacts of
Shard Keys on Cluster Operations
for information about what qualities a shard key should possess.
You cannot change the shard key once it is set.

Ensure that your schema design does not rely on indexed arrays that
grow in length without bound. Typically, best performance can
be achieved when such indexed arrays have fewer than 1000 elements.

Consider the document size limits when designing your schema.
The BSONDocumentSize limit is 16MB per document. If
you require larger documents, use GridFS.

Pre-split and manually balance chunks when inserting large
data sets into a new non-hashed sharded collection. Pre-splitting
and manually balancing enables the insert load to be distributed
among the shards, increasing performance for the initial load.

Make use of connection pooling. Most MongoDB drivers support
connection pooling. Adjust the connection pool size to suit your
use case, beginning at 110-115% of the typical number of concurrent
database requests.