用于 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)指定分片键。该分片键必须存在于您的文档中。

在您的情况下,您的文档仅包含 idname(您可以使用其中任何一个作为您的分片键)。或者,您可以指定一个附加属性作为您的分片键。比如可能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的主要内容,如果未能解决你的问题,请参考以下文章

MongoDb - 用于分片目的的重复索引字段?

Mongodb 分片

默认范围分片键 mongodb

在CentOS7上部署MongoDB分片群集

MongoDB分片群集的部署(用心描述,详细易懂)!!

除了 $lookup 运算符之外,MongoDB 4.0 中加入的替代方法是啥,因为它不适用于分片集合