创建索引导致未授权错误



我正在研究一个使用Go微服务连接到Azure CosmosDB的项目。在开发/阶段环境中,我使用MongoDB API 3.6,用于生产4.0。

微服务在集合上创建索引。对于开发/舞台环境来说,一切都很好。但是在生产中,我正在检索以下错误:

(Unauthorized) Error=13, Details='Response status code does not .表示成功,尝试的区域数:1

我已经检查了连接字符串两次,目前生产db没有防火墙规则。

我的代码看起来很熟悉:

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),
},
}...)

谁知道是什么原因导致这个错误?

我已经联系了微软支持部门,他们是这样回复的:

这是具有时间点恢复的帐户的限制。集合必须用唯一的索引创建。

https://learn.microsoft.com/en-us/azure/cosmos-db/continuous-backup-restore-introduction

您可以使用这样的命令来创建具有唯一索引的集合(来自Mongo shell、Robo3T或其他客户端)

MongoDB扩展命令管理数据在Azure Cosmos DB的API for MongoDB | 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)
}