7

我有一个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);
};

但是,这不起作用。

关于如何创建/使用分区键的任何想法?或者,数据库很小,因此如果可以删除对分区键的要求,那也很好。

4

4 回答 4

4

现在我对这个问题没有确切的答案,所以除非你觉得它是正确的,否则不需要接受这个。

到目前为止我发现的最佳解决方案是,这是由于在 Azure 控制台中创建数据库时检查了“供应吞吐量”。如果您在未选中此框的情况下删除并重新创建数据库(它位于数据库名称输入的正下方),那么您应该不会再遇到此错误。

于 2019-01-20T08:53:36.443 回答
1

您在选择共享吞吐量的数据库中创建集合时指定它。

集合与数据库

如果您使用单个集合定价,您可以设置单个集合的吞吐量。如果您使用较低定价选项,您将获得共享吞吐量(在数据库级别),其粒度较小但成本较低。

此处的详细信息:https ://azure.microsoft.com/en-us/blog/sharing-provisioned-throughput-across-multiple-containers-in-azure-cosmosdb/

分区键

如果您使用的是共享吞吐量,则需要为要添加的集合提供一个分区 ID。

所以 - 创建一个具有共享吞吐量的数据库(选中下面的复选框)

之后,当您尝试添加新文档时,您应该能够创建分区键。

于 2019-01-22T13:42:00.943 回答
1

我有一个更完整的答案。你实际上可以用猫鼬做到这一点。我通常在 Azure 函数中这样做:

mongoose.connect(process.env.COSMOSDB_CONNSTR, {
useUnifiedTopology: true,
useNewUrlParser: true,
auth: {
    user: process.env.COSMODDB_USER,
    password: process.env.COSMOSDB_PASSWORD,
},
})
.then(() => {
    mongoose.connection.db.admin().command({
        shardCollection: "mydb.mycollection",
        key: { _id: "hashed" }
    })
    console.log('Connection to CosmosDB successful ')
})
.catch((err) => console.error(err))
于 2019-09-23T22:00:30.807 回答
1

我还有另一个不完整的答案给你。看起来,是的,如果您在 Cosmos 中使用共享/数据库级别的吞吐量模型,则需要使用分区集合。但事实证明,可以使用 MongoDb 有线协议创建带有分区键的 CosmosDb 集合(这意味着不依赖于 Azure SDK,也无需通过 Azure 门户预先创建每个集合)。

唯一剩下的问题是,我认为不可能通过Mongoose 运行这个命令,它可能必须直接通过 MongoDb Node.js 驱动程序运行,但至少它仍然可以从代码运行。

从 MongoDb 外壳:

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

此命令旨在为集合设置分片键并开始对集合进行分片,但在 CosmosDb 中,它可以使用已设置的所需 partitionKey 创建集合

于 2019-02-04T19:54:42.740 回答