# CreateCollection()
This operation creates a collection.
```cpp
Status CreateCollection(const CreateCollectionRequest& request)
```
## Request Syntax
```cpp
auto request = CreateCollectionRequest()
.WithDatabaseName(db_name)
.WithCollectionName(collection_name)
.WithDescription(description)
.WithCollectionSchema(schema)
.WithNumPartitions(num_partitions)
.WithNumShards(num_shards)
.WithConsistencyLevel(level)
.WithProperties(value)
.WithIndexes(indexes);
```
**REQUEST METHODS:**
- `WithDatabaseName(const std::string& db_name)`
Sets the database name in which the collection is created.
- `WithCollectionName(const std::string& collection_name)`
Sets the name of the collection.
Historically, **[CollectionSchema](CollectionSchema.md)** also contains a collection name. **WithCollectionName()** will override the collection name specified in **[CollectionSchema](CollectionSchema.md)**.
- `WithDescription(const std::string& description)`
Sets the name of the collection.
Historically, **[CollectionSchema](CollectionSchema.md)** also contains a description. **WithDescription()** will override the collection description specified in **[CollectionSchema](CollectionSchema.md)**.
- `WithCollectionSchema(const [CollectionSchemaPtr](CollectionSchema.md)& schema)`
Sets the collection schema.
- `WithNumPartitions(int64_t num_partitions)`
Sets the number of partitions when a partition key is present.
- `WithNumShards(int64_t num_shards)`
Sets the number of shards of the collection.
Historically, **[CollectionSchema](CollectionSchema.md)** also contains the number of shards. **WithNumShards()** will override the number of shards specified in **[CollectionSchema](CollectionSchema.md)**.
- `WithConsistencyLevel([ConsistencyLevel](ConsistencyLevel.md) level)`
Sets the default consistency level of this collection.
- `WithProperties(std::unordered_map&& properties)`
Sets properties of this collection.
- `AddProperty(const std::string& key, const std::string& property)`
Sets a property of this collection.
- `WithIndexes(std::vector<[IndexDesc](../Management/IndexDesc.md)>&& indexes)`
Sets the indexes to be created.
- `AddIndex([IndexDesc](../Management/IndexDesc.md)&& index)`
Adds an index to the collection being created.
**RETURNS:**
*Status*
Check `status.IsOk()` to confirm success.
**EXCEPTIONS:**
- **StatusCode**
Check `status.Code()` and `status.Message()` for error details.
## Example
```cpp
#include "milvus/MilvusClientV2.h"
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"http://localhost:19530", "root:Milvus"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
milvus::CollectionSchemaPtr collection_schema = std::make_shared();
collection_schema->AddField({field_id, milvus::DataType::INT64, "user id", true, false});
milvus::FieldSchema varchar_scheam{field_name, milvus::DataType::VARCHAR, "user name"};
varchar_scheam.SetMaxLength(100);
collection_schema->AddField(varchar_scheam);
collection_schema->AddField({field_age, milvus::DataType::INT8, "user age"});
collection_schema->AddField(
milvus::FieldSchema(field_face, milvus::DataType::FLOAT_VECTOR, "face signature").WithDimension(dimension));
// define indexes
milvus::IndexDesc index_vector(field_face, "", milvus::IndexType::IVF_FLAT, milvus::MetricType::COSINE);
index_vector.AddExtraParam(milvus::NLIST, "100");
milvus::IndexDesc index_sort(field_age, "", milvus::IndexType::STL_SORT);
milvus::IndexDesc index_varchar(field_name, "", milvus::IndexType::TRIE);
// drop collection if it exists, the CreateCollectionRequest with indexes will automatically create indexes
// for this collection and load the collection
status = client->DropCollection(
milvus::DropCollectionRequest().WithCollectionName(collection_name).WithDatabaseName(db_name));
status = client->CreateCollection(
milvus::CreateCollectionRequest()
.WithDatabaseName(db_name)
.WithCollectionName(collection_name)
.WithDescription("my collection")
.WithNumShards(1)
.WithCollectionSchema(collection_schema)
.AddIndex(std::move(index_vector))
.AddIndex(std::move(index_sort))
.AddIndex(std::move(index_varchar))
.AddProperty("my_prop", "dummy") // add a customized property
.AddProperty(milvus::COLLECTION_TTL_SECONDS, "60") // configure a built-in property
.WithConsistencyLevel(milvus::ConsistencyLevel::STRONG));
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
```