我目前使用node-express
连接到MongoDB的一个Mongoose
应用程序,并在尝试将其迁移到Azure的宇宙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);
};
然而,这是行不通的。
关于如何创建任何想法/使用分区键?或者数据库小,所以如果能够消除对分区键,这也将是罚款的规定。
现在我没有这个问题,所以没有必要,除非你觉得这是正确的接受这一个确切的答案。
到目前为止,我已经找到了最好的解决方案是,这是由于“辟吞吐量”当Azure的控制台创建的数据库被检查。如果您删除并重新创建这个箱子不检查数据库(它的正下方输入数据库名),那么你应该不会再遇到这个错误。
当你创造你已经选择采用共享吞吐量的DB的集合可以指定它。
如果您使用单独的一个集合的定价,您可以在个人设置集合吞吐量。如果您在使用较小的定价选项,你会得到共享的吞吐量(在数据库级别),这是较少的颗粒,但更便宜。
如果您使用的共享吞吐量,您需要为您要添加的集合分区ID。
所以 - 创建共享吞吐量的DB(查看下面的复选框)
在此之后,当你尝试添加一个新的文档,你应该能够创建一个分区键。
我还没有给你另一种不非常完整的答案。这似乎是,是的,这是必需的,如果您使用的是宇宙的共享/ DB级吞吐量模型使用分区的集合。但事实证明,它可以创建一个CosmosDb收集仅使用MongoDB的线协议分区键(指上一个蓝色的SDK没有依赖性,并且无需预先创建通过Azure的门户网站的每个集合)。
剩下的唯一的缺点是,我不认为这是可以运行通过猫鼬这个命令,它可能要直接通过MongoDB的Node.js的驱动程序运行,但至少它仍然可以从代码中运行。
从MongoDB的外壳:
db.runCommand({shardCollection: "myDbName.nameOfCollectionToCreate",
key: {nameOfDesiredPartitionKey: "hashed"}})
这个命令是为了设置一个集合分片键,即可开始分片收集,但在CosmosDb它的工作原理与所需partitionKey已经被设置为创建集合。