英文:
Creating an index causes unauthorized error
问题
我正在使用Go微服务连接到Azure CosmosDB的项目中工作。
在开发/阶段环境中,我使用的是MongoDB API 3.6,而在生产环境中使用的是4.0。
这些微服务在集合上创建索引。在开发/阶段环境中一切正常。但是在生产环境中,我遇到了以下错误:
> (Unauthorized) Error=13, Details='Response status code does not
> indicate success, Number of regions attempted:1
我已经检查了连接字符串两次,并且当前生产数据库没有防火墙规则。
我的代码类似于这样:
package repository
import (
"go.mongodb.org/mongo-driver/mongo"
"log"
)
func Collection(db *mongo.Database, c string, indices ...mongo.IndexModel) *mongo.Collection {
col := db.Collection(c)
if indices != nil {
_, err := col.Indexes().CreateMany(ctx, indices)
if err != nil {
log.Fatal(err)
}
}
return col
}
// .....
package service
import (
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"repository"
)
col := repository.Collection(db, "my_col", []mongo.IndexModel{
{
Keys: bson.M{"uuid": 1},
Options: options.Index().SetUnique(true),
},
}...)
有人知道是什么原因导致了这个错误吗?
英文:
I'm working on a project using Go microservices connecting to an Azure CosmosDB.
On the dev / stage environment I'm using the MongoDB API 3.6, for production 4.0.
The microservices creating indices on the collections. For the dev / stage environment all work's fine. But on production I'm retrieving the following error:
> (Unauthorized) Error=13, Details='Response status code does not
> indicate success, Number of regions attempted:1
I've checked the connection string twice and currently there are no firewall rules for the production db.
My code looks familiar to this:
package repository
import (
"go.mongodb.org/mongo-driver/mongo"
"log"
)
func Collection(db *mongo.Database, c string, indices ...mongo.IndexModel) *mongo.Collection {
col := db.Collection(c)
if indices != nil {
_, err := col.Indexes().CreateMany(ctx, indices)
if err != nil {
log.Fatal(err)
}
}
return col
}
// .....
package service
import (
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"repository"
)
col := repository.Collection(db, "my_col", []mongo.IndexModel{
{
Keys: bson.M{"uuid": 1},
Options: options.Index().SetUnique(true),
},
}...)
Anyone an idea what causes this error?
答案1
得分: 1
我已经联系了Microsoft支持,这是他们的回复:
这是具有时间点恢复功能的帐户的限制。集合必须使用唯一索引创建。
https://learn.microsoft.com/en-us/azure/cosmos-db/continuous-backup-restore-introduction
您可以使用以下命令创建已经存在唯一索引的集合(可以从Mongo shell、Robo3T或其他客户端执行):
MongoDB扩展命令以管理Azure Cosmos DB的MongoDB API中的数据 | Microsoft Docs
例如:
db.runCommand({
customAction: "CreateCollection",
collection: "my_collection",
shardKey: "my_shard_key",
offerThroughput: 100,
indexes: [{key: {_id: 1}, name: "_id_1"}, {key: {a: 1, b: 1}, name:"a_1_b_1", unique: true} ]
})
所以现在我的代码看起来像这样:
func Collection(db *mongo.Database, c string, indices []bson.M) *mongo.Collection {
ctx, cls := context.WithTimeout(context.Background(), time.Second * 15)
defer cls()
if cursor, _ := db.ListCollectionNames(ctx, bson.M{"name": c}); len(cursor) < 1 {
cmd := bson.D{{"customAction", "CreateCollection"}, {"collection", c}}
if indices != nil {
cmd = append(cmd, bson.E{Key: "indexes", Value: indices})
}
res := db.RunCommand(ctx, cmd)
if res.Err() != nil {
log.Fatal(res.Err())
}
}
return db.Collection(c)
}
英文:
I've contacted the Microsoft support and this is what they replied:
> This is a limitation of accounts with Point in Time Restore. The collection must be created with a unique index.
>
> https://learn.microsoft.com/en-us/azure/cosmos-db/continuous-backup-restore-introduction
>
> You can use a command such as this to create the collection with the unique index already present (from the Mongo shell, or Robo3T, or another client)
>
> MongoDB extension commands to manage data in Azure Cosmos DB’s API for MongoDB | Microsoft Docs
>
>For example:
db.runCommand({
customAction: "CreateCollection",
collection: "my_collection",
shardKey: "my_shard_key",
offerThroughput: 100,
indexes: [{key: {_id: 1}, name: "_id_1"}, {key: {a: 1, b: 1}, name:"a_1_b_1", unique: true} ]
})
So now my code looks like this:
func Collection(db *mongo.Database, c string, indices []bson.M) *mongo.Collection {
ctx, cls := context.WithTimeout(context.Background(), time.Second * 15)
defer cls()
if cursor, _ := db.ListCollectionNames(ctx, bson.M{"name": c}); len(cursor) < 1 {
cmd := bson.D{{"customAction", "CreateCollection"}, {"collection", c}}
if indices != nil {
cmd = append(cmd, bson.E{Key: "indexes", Value: indices})
}
res := db.RunCommand(ctx, cmd)
if res.Err() != nil {
log.Fatal(res.Err())
}
}
return db.Collection(c)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论