我有一个已配置database-level throughput的Azure CosmosDb数据库。我们针对此Cosmos实例使用MongoDB API。共享吞吐量模型要求所有集合都指定了分区键,这似乎阻止了除Azure门户网站或官方Azure Cosmos SDK以外的几乎所有工具都无法创建集合。例如,在Robo 3T中,尝试创建集合会导致以下错误:
无法创建集合“ mycollection”。
错误:共享吞吐量收集应具有分区键
尝试通过猫鼬(类似于this question)或其他工具创建集合时,会发生相同的错误。
所以我想手术问题可以归结为: 是否可以通过MongoDb API 将所需的partitionKey传递给CosmosDb,以使收藏集创建成功?
答案 0 :(得分:1)
shardCollection
命令事实证明,使用MongoDb有线协议实现 是一种可行的方法(如果不清楚)。您可以通过发出db级命令为尚不存在的集合设置分片密钥,来创建具有Cosmos分区键(概念上映射到Mongo分片密钥)的集合:
在mongo shell中:
db.runCommand({shardCollection: "myDbName.nameOfCollectionToCreate",
key: {nameOfDesiredPartitionKey: "hashed"}})
运行此命令后,我的ComosDb数据库(具有数据库级共享吞吐量)现在包含具有适当设置的分区键的新集合!
我还没有找到直接通过Mongoose直接调用runCommand
的方法,但是至少这种本机/有线协议方法应该可以与任何正式的MongoDb驱动程序一起使用,因此比依赖于Azure Cosmos SDK只是为了创建一个集合。
答案 1 :(得分:1)
可以使用扩展命令。
CreateCollection命令的格式如下:
{
customAction: "CreateCollection",
collection: "<Collection Name>",
shardKey: "<Shard key path>",
offerThroughput: (int), // Amount of throughput allocated to a specific collection
}
JavaScript
db.runCommand({customAction: "CreateCollection", collection: "testCollection", shardKey: "sharedKeyName"});
Java
BasicDBObject testCollection = new BasicDBObject("customAction", "CreateCollection")
.append("collection", "testCollection")
.append("shardKey", "sharedKeyName");
db.runCommand(testCollection);