用于 MongoDB API 的分片密钥和 Azure CosmosDB
Posted
技术标签:
【中文标题】用于 MongoDB API 的分片密钥和 Azure CosmosDB【英文标题】:Shard key and Azure CosmosDB for MongoDB API 【发布时间】:2020-03-05 16:50:42 【问题描述】:我创建了一个使用 MongoDB 的 Python SDK 的 CosmosDB 数据库,我们将数据库称为school
,将集合称为students
。在创建数据库时,Azure UI 要求我创建一个无限存储容量的分片键,我们称之为school.students
。
我正在使用pymongo
添加以下文档:
"id": "abc123",
"name": "jack"
代码如下:
from pymongo import MongoClient
student_data =
"id": "abc123",
"name": "jack"
client = MongoClient("mongodb://...")
db = client["school"]
collection = db["students"]
collection.insert_one(student_data)
当我选择10GB的存储时,我添加文档没有问题,但是当我选择使用shard key的unlimited选项时,我收到以下错误:
pymongo.errors.WriteError: document does not contain shard key at 'school.students'
问题是,我应该在哪里使用分片键?以及如何克服这个问题?
【问题讨论】:
【参考方案1】:MongoDB 中的 shard key
映射到 Cosmos DB 中的 partition key
。创建集合时,如果您通过门户创建集合,系统会要求您指定一个分区键。或者,您可以通过 MongoDB 的命令行工具或代码(然后称为 shard key)指定分片键。该分片键必须存在于您的文档中。
在您的情况下,您的文档仅包含 id
和 name
(您可以使用其中任何一个作为您的分片键)。或者,您可以指定一个附加属性作为您的分片键。比如可能schoolid
:
student_data =
"id": "abc123",
"name": "jack",
"schoolid": "school1"
创建集合时,您需要指定schoolid
作为分区键。此时,您的文档保存将起作用,因为您的文档中将包含一个分片键(分区键)。
在您的原始示例中,您将 school.students
指定为您的分片键。这将要求您拥有一个名为 school
的属性和一个名为 students
的子属性(我猜这并没有太大意义):
student_data =
"id": "abc123",
"name": "jack",
"school":
"students": ...
【讨论】:
【参考方案2】:您可以通过 mongo shell 创建集合
db.runCommand( shardCollection: "myDb.students", key: id: "hashed" )
【讨论】:
我已经有一个来自 Azure UI 的集合,如students
,它要求我在创建集合时创建一个分片键。但是我应该如何使用分片键呢?
你需要从 shell 创建它,而不是从 azure ui
@Sajeetharan - 这不是真的。您完全可以通过门户创建集合(分片键在门户中称为 分区键)。 OP 的问题是他们指定了他们尝试插入的文档中不存在的分区键(分片键)。我在回答中充分解释了这一点。
@DavidMakogon 是的,我同意你的观点。我在这里提到的是不同的。我记得之前从门户创建时也有类似的问题,即使在将分区键包含在 MongoDB 中之后,它实际上并没有按预期的方式工作。我会尝试在此处找到帖子并粘贴,即使我没有尝试过
@Sajeetharan - 过去可能存在问题。在发布我的答案之前,我创建了一个带有分区键的新集合,并且通过 mongo shell 连接和编写/阅读文档没有问题。以上是关于用于 MongoDB API 的分片密钥和 Azure CosmosDB的主要内容,如果未能解决你的问题,请参考以下文章