Работает ли Mongoose с Cosmos DB с выделенной пропускной способностью?

Описание:

Я установил новую базу данных Cosmos DB с выделенной пропускной способностью, чтобы разделить единицы измерения в секунду для всех коллекций и минимизировать затраты.

Мой API для доступа к Cosmos - это Node.JS с Express и Mongoose.

База данных теперь настроена с 1 коллекцией с именем группы с ключом раздела / ключом сегмента раздел

Раньше я без проблем использовал Mongoose с Cosmos DB, но при попытке в этом режиме получаю следующее сообщение об ошибке:

{
"_t": "OKMongoResponse",
"ok": 0,
"code": 2,
"errmsg": "Shared throughput collection should have a partition key\r\nActivityId: 9217017f-0000-0000-0000-000000000000, Microsoft.Azure.Documents.Common/2.4.0.0",
"$err": "Shared throughput collection should have a partition key\r\nActivityId: 9217017f-0000-0000-0000-000000000000, Microsoft.Azure.Documents.Common/2.4.0.0",
"name": "MongoError"
}

Я много искал ответы, но не вижу, чтобы кто-нибудь еще сталкивался с такой же проблемой в той же среде.

Окружающая среда:

  • Версия узла: v10.16.0
  • Версия Mongoose: 5.6.6
  • Экспресс-версия: 4.17.1

Тестирование:

Я пробовал настроить модель мангуста следующим образом:

var schema = mongoose.Schema({
    name: String,
}, { shardKey: { partition: "1" }})

А вот так:

var schema = mongoose.Schema({
    name: String,
    partition: { type: String, default: "1"},
})

Я также попытался отправить ключ раздела в качестве значения

{
    "name": "Test",
    "partition": "1"
}

Если я запустил указанный выше JSON как новый документ в обозревателе данных портала Azure, я смогу добавить этот документ.

Кто-нибудь знает, поддерживает ли Mongoose Cosmos DB в подготовленном режиме пропускной способности? И если он поддерживается, могу ли я получить пример того, как настроить мангуста / модель, чтобы заставить ее работать.

Спасибо


person Keb    schedule 23.07.2019    source источник


Ответы (1)


Ваша ошибка

Коллекции с общей пропускной способностью должны иметь ключ раздела

Эта ошибка возвращается, когда в базе данных с подготовленной пропускной способностью создается коллекция без указанного ключа сегмента. Это говорит о том, что мангуст пытается создать коллекцию, а не использовать созданную вами «группу». Я считаю, что для использования коллекции групп вы должны определить свою модель:

const Model = mongoose.model("Group", schema)

Еще одна проблема, которую я обнаружил, заключается в том, что когда Mongoose пытается создать индексы, он создает коллекцию system.indexes, что также вызывает указанную выше ошибку. Когда autoIndex выключен, все работает плавнее

Надеюсь, это решит вашу проблему

Определение схемы

Я обнаружил, что для того, чтобы запросы работали, схема должна быть определена как:

var schema = mongoose.Schema({
    name: String,
    partition: {
        type: Number
        default: 1
    },
}, { shardKey: { partition: "1" }})

Если параметр shardKey опущен, вы получите следующую ошибку:

документ не содержит ключ осколка

Поддержка Mongoose для создания коллекций

Насколько я могу судить, в mongoose нет поддержки для создания коллекций в базе данных с подготовленной пропускной способностью. Можно создавать коллекции, используя собственный клиент mongo, например:

const db = Model.db.db;

db.command({
    shardCollection: `${dbName}.${collectionName}`,
    key: {
        partition: 'hashed' 
    },
}).then(...)

Когда я попробовал ключ { partition: 1 }, я получил следующую ошибку:

Для сегментированной коллекции поддерживается только один хешированный ключ.

Поэтому я придерживался хеширования.

Надеюсь, это поможет

person Sam    schedule 10.12.2019
comment
Спасибо, Сэм, я решил использовать MongoDB Atlas для этого проекта, но обязательно протестирую его, когда еще раз попробую CosmosDB. - person Keb; 14.12.2019