【问题标题】:Shard key and Azure CosmosDB for MongoDB API用于 MongoDB API 的分片密钥和 Azure CosmosDB
【发布时间】: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'

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

【问题讨论】:

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


    【解决方案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 连接和编写/阅读文档没有问题。
      猜你喜欢
      • 1970-01-01
      • 2015-07-13
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2018-03-02
      • 2015-08-13
      • 2020-07-28
      相关资源
      最近更新 更多