片键和 Azure CosmosDB for MongoDB API

Aks*_*hay 4 python azure azure-cosmosdb azure-cosmosdb-mongoapi

我创建了一个使用 MongoDB 的 Python SDK 的 CosmosDB 数据库,我们将数据库称为 ,school将集合称为students。在创建数据库时,Azure UI 要求我创建一个用于无限存储容量的分片键,我们称之为school.students

我用来pymongo添加以下文档:

{
  "id": "abc123",
  "name": "jack"
}
Run Code Online (Sandbox Code Playgroud)

代码如下:

{
  "id": "abc123",
  "name": "jack"
}
Run Code Online (Sandbox Code Playgroud)

当我选择 10GB 存储时,添加文档没有问题,但是当我选择带分片键的无限选项时,出现以下错误:

pymongo.errors.WriteError: document does not contain shard key at 'school.students'
Run Code Online (Sandbox Code Playgroud)

问题是,我应该在哪里使用分片键?以及如何克服这个问题?

Dav*_*gon 6

MongoDB 中的Ashard key映射到partition keyCosmos DB 中的 a。创建集合时,如果您通过门户创建集合,系统会要求您指定分区键。或者,您可以通过 MongoDB 的命令行工具或通过代码指定分片键(此时称为分片键)。该分片键必须存在于您的文档中。

在您的情况下,您的文档仅包含idname(您可以使用其中任何一个作为您的分片键)。或者,您可以指定一个附加属性作为您的分片键。例如,也许schoolid

student_data = {
  "id": "abc123",
  "name": "jack",
  "schoolid": "school1" 
}
Run Code Online (Sandbox Code Playgroud)

创建集合时,您需要指定schoolid为分区键。此时,您的文档保存将起作用,因为您的文档中将包含一个分片键(分区键)。

在原始示例中,您指定school.students为分片键。这需要您有一个名为的属性school和一个名为的子属性students(我猜这样做没有太大意义):

student_data = {
  "id": "abc123",
  "name": "jack",
  "school": {
     "students": ...
  }
}
Run Code Online (Sandbox Code Playgroud)