azure documentdb 创建文档重复项 Id 属性

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

我想将以下对象存储在azure documentdb中

public class MyDocument
{
    public string Id { get; set; }
    public SomeOtherClass SomeOtherClass { get; set; }
}

属性 Id 是一个时间戳 (yyyyMMddHHmmss),后跟一个 guid。作为副作用,这允许我对 Id 进行排序。 我用这个调用来存储它:

 await docDbClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(db, coll), myDoc);

存储文档时,它具有我的文档属性(Id 和 SomeOtherClass)和附加

"id"
属性(注意小写“i”)。 (以及 documentdb 使用的一些其他技术属性)。这充满了指南。

据我所知,通过存储一个已经具有

Id
属性的对象,documentdb 会使用它而不是生成它自己的(但它确实生成了!)。

现在我有两个问题:我无法检查

 await docDbClient.ReadDocumentAsync(UriFactory.CreateDocumentCollectionUri(db, coll), myDoc.Id);

查看文档是否已存在,并且我无法使用 Id 属性来排序和比较查询中的文档,如下所示:

IQueryable<MyDocument> query = _client.CreateDocumentQuery<MyDocument>(
            UriFactory.CreateDocumentCollectionUri(_account.Database, _account.Collection), queryOptions);
 query = query.Where(x => x.Id.CompareTo(inputValue) >= 0);

其中 inputValue 是相同形式的另一个键,用于分页。因为当从 documentdb 中反序列化对象时,

id
属性替换了我的
Id
属性,并且我永远看不到它的原始值。

我用错了吗? 我是否错误地假设将使用我的 Id 属性而不是自动生成的小写属性?


编辑:我可以确认在

[JsonProperty("id")]
属性上使用
Id
时可以解决此问题。但是任何已经插入的文档我都无法检索我的原始值
Id

c# azure azure-cosmosdb
4个回答
4
投票

ID 字段应为小写的“id”。

这样就解决了:

[JsonProperty(PropertyName = "id")]
public string Id { get; set; }

2
投票

DocumentDB 的

id
属性必须是唯一的。您自己的
Id
属性(I 大写)不是特殊属性 - 它只是...您创建的属性。

您已经在

id
属性中看到了自动生成的 guid。请注意,您可以将自己的值放入
id
中,只要它是唯一的即可。您不必接受默认值(guid)。


2
投票

CosmosDb 仅保证同一分区键的唯一

id
字段值。 因此,这可以存在于同一个集合中:

{
    "id": "12345",
    "myPartitionKey": "A",
    ...
},
{
    "id": "12345",
    "myPartitionKey": "B", //different partition key than above
    ...
},

但这不可能存在:

{
    "id": "12345",
    "myPartitionKey": "A",
    ...
},
{
    "id": "12345",
    "myPartitionKey": "A", // Inconceivable! Same id AND partition key as above
    ...
},

0
投票

更多最新信息:如果您使用 IEntityTypeConfiguration 来配置映射,则只需使用 ToJsonProperty() 方法来定义属性的名称。

另一个技巧是使用 NuGet 包 Humaziner 以驼峰命名法配置属性名称。例如:

public class MyDocument
{
    public string Id { get; set; }
    public SomeOtherClass SomeOtherClass { get; set; }
}

public class SomeOtherClass
{
    public string Id { get; set; }
    public string SomeProperty { get; set; }
}

public void Configure(EntityTypeBuilder<MyDocument> builder)
{
    builder.ToContainer("MyDocuments");
    builder.HasKey(x => x.Id);

    builder
        .Property(x => x.Id)
            .ToJsonProperty(
                nameof(MyDocument.Id).Camelize());

    builder.OwnsOne(
        x => x.SomeOtherClass,
        x =>
        {
            x.Property(y => y.SomeProperty)
                .ToJsonProperty(
                    nameof(SomeOtherClass.SomeProperty).Camelize());
        });
}
© www.soinside.com 2019 - 2024. All rights reserved.