如何使用Mongo API在共享吞吐量cosmosdb中创建集合

时间:2019-02-04 19:05:48

标签: azure azure-cosmosdb azure-cosmosdb-mongoapi

我有一个已配置database-level throughput的Azure CosmosDb数据库。我们针对此Cosmos实例使用MongoDB API。共享吞吐量模型要求所有集合都指定了分区键,这似乎阻止了除Azure门户网站或官方Azure Cosmos SDK以外的几乎所有工具都无法创建集合。例如,在Robo 3T中,尝试创建集合会导致以下错误:

  

无法创建集合“ mycollection”。

     

错误:共享吞吐量收集应具有分区键

尝试通过猫鼬(类似于this question)或其他工具创建集合时,会发生相同的错误。

所以我想手术问题可以归结为: 是否可以通过MongoDb API 将所需的partitionKey传递给CosmosDb,以使收藏集创建成功?

2 个答案:

答案 0 :(得分:1)

通过db.runCommand(...)使用shardCollection命令

事实证明,使用MongoDb有线协议实现 是一种可行的方法(如果不清楚)。您可以通过发出db级命令为尚不存在的集合设置分片密钥,来创建具有Cosmos分区键(概念上映射到Mongo分片密钥)的集合:

在mongo shell中:

db.runCommand({shardCollection: "myDbName.nameOfCollectionToCreate", 
               key: {nameOfDesiredPartitionKey: "hashed"}})

运行此命令后,我的ComosDb数据库(具有数据库级共享吞吐量)现在包含具有适当设置的分区键的新集合!

我还没有找到直接通过Mongoose直接调用runCommand的方法,但是至少这种本机/有线协议方法应该可以与任何正式的MongoDb驱动程序一起使用,因此比依赖于Azure Cosmos SDK只是为了创建一个集合。

答案 1 :(得分:1)

可以使用扩展命令。

Create collection

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);