我需要在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();
,但似乎该驱动程序无法定义分区键(这很有意义)。
如何使用分区键创建集合?
谢谢。
答案 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());
}