Mongoose с CosmosDB: Ошибка при получении `В общей коллекции пропускной способности должен быть ключ раздела` - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть приложение node-express, которое в настоящее время использует Mongoose для подключения к MongoDB, и пытаюсь перенести его в Azure Cosmos DB.

Когда я просто разрешаю Mongoose создавать базу данных, приложение работает нормально, однако база данных создается по индивидуальной цене сбора RU.

Если я создаю новую базу данных с включенной общей пропускной способностью и пытаюсь ее использовать, я получаю сообщение об ошибке Shared throughput collection should have a partition key

Я попытался обновить схему сбора, добавив в нее ключ шарда, например:

const mongoose = require('mongoose');

module.exports = function() {
  const types = mongoose.Schema.Types;
  const messages = new mongoose.Schema({
    order: { type: types.ObjectId, required: true, ref: 'orders' },
    createdAt: { type: Date, default: Date.now },
    sender: { type: types.ObjectId, required: true, ref: 'users' },
    recipient: { type: types.ObjectId, ref: 'users' },
    text: { type: String, required: true },
    seen: { type: Boolean, default: false },
  }, { shardKey: { order: 1 } });

  return mongoose.model('messages', messages);
};

Однако это не работает.

Есть идеи о том, как создать / использовать ключ раздела?В качестве альтернативы база данных небольшая, поэтому, если ее можно удалить, для ключа раздела это тоже будет хорошо.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вы указываете это при создании коллекции в БД, в которой вы выбрали общую пропускную способность.

Коллекция против базы данных

Если вы используете индивидуальную цену коллекции,Вы можете установить пропускную способность для отдельных коллекций.Если вы используете опцию меньшей цены, вы получите общую пропускную способность (на уровне базы данных), которая будет менее детальной, но менее дорогой.

Подробности здесь: https://azure.microsoft.com/en-us/blog/sharing-provisioned-throughput-across-multiple-containers-in-azure-cosmosdb/

Разделениеключи

Если вы используете общую пропускную способность, вам потребуется идентификатор раздела для добавляемой коллекции.

Итак - создайте БД с общей пропускной способностью (установите флажок ниже)

После этого при попытке добавить новый документ вы сможете создать ключ раздела.

0 голосов
/ 04 февраля 2019

У меня есть еще один не совсем полный ответ для вас.Кажется, да, требуется для использования секционированных коллекций, если вы используете модель пропускной способности shared / db-level в Cosmos.Но оказывается, что можно создать коллекцию CosmosDb с ключом раздела, используя только проводной протокол MongoDb (что означает отсутствие зависимости от Azure SDK и отсутствие необходимости предварительно создавать каждую коллекцию через портал Azure).).

Единственный оставшийся улов - я не думаю, что можно выполнить эту команду через Mongoose, вероятно, ее придется запускать напрямую через драйвер MongoDb Node.js,но, по крайней мере, его все еще можно запустить из кода.

Из оболочки MongoDb:

db.runCommand({shardCollection: "myDbName.nameOfCollectionToCreate", 
               key: {nameOfDesiredPartitionKey: "hashed"}})

Эта команда предназначена для установки ключа сегментирования для коллекции и начала сегментирования коллекции, нов CosmosDb он работает для создания коллекции с требуемой ключом ключа ключа уже установленным.

0 голосов
/ 20 января 2019

Теперь у меня нет точного ответа на этот вопрос, поэтому нет необходимости принимать его, если вы не уверены, что он правильный.

Лучшее решение, которое я нашел на данный момент, заключается в том, что это из-заПропускная способность »проверяется при создании базы данных в консоли Azure.Если вы удалите и воссоздаете базу данных, если этот флажок не установлен (он находится прямо под вводом имени базы данных), эта ошибка больше не возникает.

...