说明:
我已经建立了一个具有预配置吞吐量的新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"
}
我已经搜索了很多答案,但是没有看到其他人在相同的环境下遇到相同的问题。
环境:
测试:
我尝试过这样设置猫鼬模型:
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? 如果支持的话,请问一个例子,说明如何设置猫鼬/模型以使其正常工作。
谢谢
答案 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 }
时,出现以下错误:
分片集合仅支持单个哈希键。
所以我坚持使用“散列”
希望这对您有所帮助