创建索引会导致未经授权的错误。

huangapple go评论89阅读模式
英文:

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: &quot;CreateCollection&quot;,
  collection: &quot;my_collection&quot;,
  shardKey: &quot;my_shard_key&quot;,
  offerThroughput: 100,
  indexes: [{key: {_id: 1}, name: &quot;_id_1&quot;}, {key: {a: 1, b: 1}, name:&quot;a_1_b_1&quot;, 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{&quot;name&quot;: c}); len(cursor) &lt; 1 {
	    cmd := bson.D{{&quot;customAction&quot;, &quot;CreateCollection&quot;}, {&quot;collection&quot;, c}}
	    if indices != nil {
		    cmd = append(cmd, bson.E{Key: &quot;indexes&quot;, Value: indices})
	    }

	    res := db.RunCommand(ctx, cmd)

	    if res.Err() != nil {
		    log.Fatal(res.Err())
	    }
    }

    return db.Collection(c)
}

huangapple
  • 本文由 发表于 2021年8月5日 20:08:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/68666316.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定