我想将以下对象存储在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
ID 字段应为小写的“id”。
这样就解决了:
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
DocumentDB 的
id
属性必须是唯一的。您自己的 Id
属性(I 大写)不是特殊属性 - 它只是...您创建的属性。
您已经在
id
属性中看到了自动生成的 guid。请注意,您可以将自己的值放入 id
中,只要它是唯一的即可。您不必接受默认值(guid)。
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
...
},
更多最新信息:如果您使用 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());
});
}