Azure Cosmos MongoDB-使用分片键创建集合

时间:2019-01-20 08:08:52

标签: c# azure-cosmosdb azure-cosmosdb-mongoapi

我需要在Azure的Cosmos MongoDB中创建一个集合,但是要使用分区/分片键,因为所需的配置是数据库将具有预配置的吞吐量(一定数量的RU),并且其中的集合将具有共享的吞吐量

集群的API设置为Cosmos DB Mongo API-如果我在宇宙中创建集合,则插入/删除没有问题,但是如果我使用下面的代码创建集合,我会收到一条错误消息,说{{ 1}},即使查看门户网站和代码中的集合看起来一样。

{"Command insert failed: document does not contain shard key."}

我已经与Microsoft代表进行了交谈,但是我缺少“答案”。他建议使用client.CreateDocumentCollectionAsync(database.SelfLink, new DocumentCollection { Id = "CollectionName", PartitionKey = new PartitionKeyDefinition { Paths = new Collection<string> { "/_id" } } }).Wait(); ,但似乎该驱动程序无法定义分区键(这很有意义)。

如何使用分区键创建集合?

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用customCommand通过ShardKey创建一个集合。像这样的东西:

var createCollectionCommand = new BsonDocument
                {
                    { "customAction", "CreateCollection" },
                    { "collection", "YourCollectionName" },
                    { "shardKey", "YourShardKey" }
                };
cosmosDatabase.RunCommand<BsonDocument>(createCollectionCommand);

答案 1 :(得分:0)

我想您需要通过mongo shell命令执行该操作

db.runCommand( { shardCollection: "yourCollection", key: { rateId: "_id" } } )

请参阅 here 形成更多详细信息

答案 2 :(得分:0)

我正在处理同一件事。使用MongoDB csharp驱动程序时,不应调用db.CreateCollection,而应使用分片命令。这将为您创建带有分区键的无限集合。

//Sharded collection must be initialized this way
var bson = new BsonDocument
{
    { "shardCollection", mongoClientProvider.DatabaseName + "." + CollectionName },
    { "key", new BsonDocument(ShardKeyName, "hashed") }
};

var shellCommand = new BsonDocumentCommand<BsonDocument>(bson);

try
{
    var commandResult = database.RunCommand(shellCommand);
}
catch (MongoCommandException ex)
{
    logger.LogError(ex, ex.Result.ToString());
}