Mongoose是否可以按预配置的吞吐量与Cosmos DB一起使用?

时间:2019-07-23 22:55:04

标签: node.js mongoose azure-cosmosdb azure-cosmosdb-mongoapi

说明:

我已经建立了一个具有预配置吞吐量的新Cosmos数据库数据库。这是为了共享所有集合的RU / s,并最大程度地降低成本。

我访问Cosmos的API是带有Express和Mongoose的Node.JS。

现在已使用名为 groups 1 集合以及分区键/分键 partition

设置数据库

过去,我曾将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
  • 猫鼬版本: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"
}

如果在Azure Portal Data Explorer中将上述JSON作为新文档运行,则可以添加该文档。

有人知道Mongoose是否在预配置的吞吐量模式下支持Cosmos DB? 如果支持的话,请问一个例子,说明如何设置猫鼬/模型以使其正常工作。

谢谢

1 个答案:

答案 0 :(得分:1)

您的错误

  

共享吞吐量收集应具有分区键

在具有预配置吞吐量的数据库中创建没有指定分片键的集合时,将返回此错误。这表明猫鼬正在尝试创建集合,而不是使用您创建的“组”。我相信,要使用groups集合,您应该定义模型:

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 选项,则会出现以下错误:

  

文档不包含分片键

对创建集合的猫鼬支持

据我所知,猫鼬不支持在具有预配置吞吐量的数据库中创建集合。可以使用本地mongo客户端创建集合,例如:

const db = Model.db.db;

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

尝试键{ partition: 1 }时,出现以下错误:

  

分片集合仅支持单个哈希键。

所以我坚持使用“散列”

希望这对您有所帮助