2

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

未能创建集合“mycollection”。

错误:共享吞吐量集合应该有一个分区键

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

所以我想操作性问题归结为: 有没有办法通过 MongoDb API将所需的 partitionKey 传递给 CosmosDb,以便集合创建成功?

4

2 回答 2

1

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

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

在 mongo 外壳中:

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

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

我还没有想出一种runCommand通过 Mongoose 直接调用的方法,但至少这种本机/有线协议方法应该适用于任何官方 MongoDb 驱动程序,因此比仅仅依靠 Azure Cosmos SDK 创建一个更便携收藏。

于 2019-02-04T19:44:47.123 回答
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"});

爪哇

BasicDBObject testCollection = new BasicDBObject("customAction", "CreateCollection")
                            .append("collection", "testCollection")
                            .append("shardKey", "sharedKeyName");
db.runCommand(testCollection);
于 2020-09-15T03:31:29.937 回答