如何在RavenDB 5.4中设置唯一约束索引?

问题描述 投票:0回答:1

他们的文档没有澄清这一点,ChatGPT 总是给我错误的代码(可能来自 RavenDB 的旧版本)

我一直在使用下面的代码来设置唯一约束,但是即使这是创建新索引,也没有设置唯一约束。我正在使用 GoLang。

index := ravendb.NewIndexCreationTask("UniqueEmailIndexTask")
    index.Map = "from user in docs.Users select new { user.Email }"

    emailUniqueIndexDef := index.CreateIndexDefinition()
    emailUniqueIndexDef.Name = "UniqueEmailIndex"
    emailUniqueIndexDef.Fields = map[string]*ravendb.IndexFieldOptions{
        "Email": {
            Indexing: ravendb.FieldIndexingExact,
            Storage:  ravendb.FieldStorageNo,
        },
    }

    err := store.Maintenance().Send(ravendb.NewPutIndexesOperation(emailUniqueIndexDef))
ravendb unique-constraint ravendb5
1个回答
0
投票

因此,当我在 RavenDb 的 github 问答部分寻求答案时,他们要求我参考 RavenDb 文档。 RavenDB 没有“唯一约束”的概念(至少从版本 5 开始没有)。所以一直以来,我都在他们的文档中搜索错误的关键字“唯一约束”,而这只是不同的概念和术语。

RavenDb 具有 CompareExchangeOperation 或原子 ClusterWideTransactions 的功能,我们可以使用它们来存储唯一的字段值。

由于截至 2023 年 8 月,集群范围的事务功能尚未包含在他们的 golang 客户端包中(他们承诺将其与 ravenDb 6.0 go-client 一起提供),因此我通过 CompareExchange 方法来使用它,该方法也对用户的电子邮件地址在“CompareExchange”存储中是唯一的。

所以参考他们的文档,特别是本节https://ravendb.net/docs/article-page/5.4/csharp/client-api/operations/compare-exchange/overview,我使用以下代码让它工作在 Golang 中。

op, _ := ravendb.NewPutCompareExchangeValueOperation("emails/"+*user.Email, user.ID, 0)
err = r.store.Operations().Send(op, nil)
if err != nil {
   return nil, fmt.Errorf("r.store.Operations().Send(op, nil) failed with %s", err)
}
if !op.Command.Result.IsSuccessful {
   return nil, fmt.Errorf("`enter code here`User with that email already exists")
}

请注意:这会将“emails/[email protected]”存储在CompareExchange存储中,即使您删除了用户文档,用户也无法使用删除的电子邮件ID进行注册,因为您有还可以从 CompareExchange 存储中删除电子邮件条目。

© www.soinside.com 2019 - 2024. All rights reserved.