Ключ Shard и Azure CosmosDB для API MongoDB - PullRequest
1 голос
/ 09 ноября 2019

Я создал базу данных CosmosDB, которая использует Python SDK от MongoDB, давайте назовем базу данных как school, а коллекцию - students. При создании базы данных пользовательский интерфейс Azure попросил меня создать ключ сегмента для неограниченной емкости хранилища, назовем его 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)

Когда я выбрал хранилище с 10 ГБ, у меня нет проблем с добавлением документа, но когда я выбрал неограниченный вариант с ключом шарда, я получаю следующую ошибку:

pymongo.errors.WriteError: document does not contain shard key at 'school.students'

Вопрос в том, где мне использовать ключ шарда? и как с этим справиться?

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Вы можете создать коллекцию через оболочку mongo

db.runCommand( { shardCollection: "myDb.students", key: { id: "hashed" } } )
0 голосов
/ 09 ноября 2019

A shard key в MongoDB отображается на partition key в Cosmos DB. Когда вы создаете свою коллекцию, вам предлагается указать ключ раздела , если вы создаете ее через портал. Или вы можете указать ключ shard с помощью инструмента командной строки MongoDB или с помощью кода (тогда он называется ключом shard ). Этот ключ должен существовать в вашем документе.

В вашем случае ваш документ содержит только id и name (и вы можете использовать любой из них в качестве своего ключа шарда). В качестве альтернативы вы можете указать дополнительное свойство в качестве вашего ключа шарда. Например, возможно schoolid:

student_data = {
  "id": "abc123",
  "name": "jack",
  "schoolid": "school1" 
}

При создании коллекции вы должны указать schoolid в качестве ключа раздела. На этом этапе сохранение документа будет работать, поскольку в ваш документ будет включен ключ шарда (ключ раздела).

В исходном примере вы указали school.students в качестве ключа шарда. Для этого вам потребуется свойство с именем school с под-свойством с именем students (что, я думаю, не имеет особого смысла):

student_data = {
  "id": "abc123",
  "name": "jack",
  "school": {
     "students": ...
  }
}
...