我有一个文档数据库存储库类,它有一个 get 方法,如下所示:
private static DocumentClient client;
public async Task<TEntity> Get(string id, string partitionKey = null)
{
try
{
RequestOptions requestOptions = null;
if (partitionKey != null)
{
requestOptions = new RequestOptions { PartitionKey = new PartitionKey(partitionKey) };
}
var result = await client.ReadDocumentAsync(
UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id),
requestOptions);
return (TEntity)(dynamic)result.Resource;
}
catch (DocumentClientException e)
{
// Have logic for different exceptions actually
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个集合 - Collection1 和 Collection2。Collection1 未分区,而 Collection2 已分区。
在客户端,我创建两个存储库对象,每个集合一个。
private static DocumentDBRepository<Collection1Item> collection1Repository = new …Run Code Online (Sandbox Code Playgroud) 我试图.Any()在子句中嵌套一个.Where()子句来查询本地 CosmosDb 模拟器。
代码如下所示;其中permittedStundentIds是变量 ( List<long>) 且是CosmosDb 中的aaDocument
.Where(a => permittedStudentIds.Any(sId => a.Students.Any(s => s.Id == sId)));
Run Code Online (Sandbox Code Playgroud)
当我执行查询时,出现错误:
不支持“任意”方法。ActivityId:800000a8-0002-d600-b63f-84710c7967bb,文档db-dotnet-sdk/1.22.0主机/64位MicrosoftWindowsNT/10.0.16299.0
我尝试了多种变体来获得等效的表达式,但无济于事。唯一有效的方法是使用 a.Contains()并对学生索引进行硬编码;这是不可行的,因为学生的人数可能不知道。
.Where(a => permittedStudentIds.Contains(a.Students[0].Id));
Run Code Online (Sandbox Code Playgroud)
我确实了解 CosmosDb 的 Sql API 尚不支持某些 lambda 扩展,但是有解决方法吗?
在 Azure Cosmos DB (SQL API) 中,以下查询收费9356.66 RU:
SELECT * FROM Core c WHERE c.id = @id -- @id is a GUID
Run Code Online (Sandbox Code Playgroud)
相比之下,以下更复杂的查询仅收费6.84 RU:
SELECT TOP 10 * FROM Core c WHERE c.type = "Agent"
Run Code Online (Sandbox Code Playgroud)
这两个示例中的文档都非常小,但具有一些属性。此外,文档集合不使用任何自定义索引策略。该集合包含 105685 份文档。
对我来说,这听起来好像“id”字段上没有正常工作的索引。
这怎么可能以及如何解决?
更新:
全部,
我正在使用更改源处理器库。想知道处理服务故障以及 ProcessChangesAsync 方法中的异常/错误场景的最佳方法。以下是我所指的事件。
1) 服务失败 - 具有处理器库的服务在某些操作过程中崩溃。如何从同一文档(失败实例上的文档)启动该流程?是否有任何内置机制可以使更改源从最后一个失败的文档开始?例如,假设,在当前批次中,我们成功处理了 10 个 docs.5,然后由于网络故障或其他原因导致服务中断。一旦服务重新启动,我的流程会从第 6 个文档开始吗?如何实现这一目标?
2) 异常和错误- ProcessChangesAsync 方法中的任何错误都可以在全局级别使用 try catch 进行处理,但如何保留这些失败记录并使它们可用于下一批?再次,在变更提要过程中寻找任何可用的内置机制。
我已经查看了有关此问题的一些答案/问题,但尚未找到解决方案。
我有一个包含文档(简化)的集合,如下所示:
{
"id": 123
"stuff": "abc"
"array":[
{
"id2":456
"properties": [
{
"id3": 789
"important": true
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想检查for我的集合中的每个文档,for每个array对象array,for每个对象properties,如果有的important: true话。然后返回:
"id": 123
"id2": 456
"id3": 789
Run Code Online (Sandbox Code Playgroud)
我尝试过使用:
client.queryDocuments(self.collection._self, querySpec).toArray(function(err, results) {
if (err) {
callback(err);
} else {
callback(null, results[0]);
}
});
Run Code Online (Sandbox Code Playgroud)
但问题是数组有最大字符数限制。如果我的收藏有数百万份文档,这可能会超出。(Javascript增加最大数组大小)
或者,我误解了上面的问题吗?它是在谈论数组中的对象数量(其中每个对象可以具有无限的对象字符长度吗?)
因此,我正在寻找一个for loop类似的解决方案,其中返回每个文档,我进行分析,然后移动到下一个/并行执行它们。
任何见解将不胜感激。
我目前正在与一个开发团队合作,将 CosmosDB 实现为后端存储,我对它的实际用途有一些疑问。
我知道这些文档应该是扁平结构的,但这到底是什么意思?
当数据确实是相关的并且彼此非常依赖时,这种设计是否正确,或者 SQL 数据库是否更适合?
零售产品
{
"RetailProductId": "123",
"FriendlyName": "TestRetailProduct",
"WholeSaleProductId": "100"
}
Run Code Online (Sandbox Code Playgroud)
批发产品
{
"WholeSaleProductId": "100",
"ProviderID": "112233445566",
"PhysicalItemsIds": ["1000", "2000", "3000"]
}
Run Code Online (Sandbox Code Playgroud)
提供者
{
"ProviderId": "112233445566",
"Description": "ProviderA"
}
Run Code Online (Sandbox Code Playgroud)
RetailProduct 或 WholeSaleProduct 还链接了更多文档,但这只是为了提供概述。
像这样存储数据,被认为是像 CosmosDB 这样的数据库的良好实践
当使用 Azure Cosmos DB 并查询一个分区时,我只需在 FeedOptions 中指定分区键。但是当我必须查询 n 个分区时,我有(据我所知)2 个选项:
当我必须对整个结果集(跨所有分区)应用排序标准和分页时,我认为第一种方法将达到其极限。
使用 .NET SQL API 在 Cosmos DB 中跨多个分区进行查询的推荐方法是什么?
我一直在浏览不同的示例和帖子,但找不到任何推荐的命名约定。当我查看文档时,我可以看到标准属性(id、ts ..)是小写的。然而,C# 的命名约定是属性为大写。这里推荐的方法是什么,您是否将所有内容都小写/大写,或者仅在 Cosmos DB 中使用小写属性,而不是在 C# 模型中使用小写属性或 .. ?这里有什么指导方针吗?
我正在尝试使用 Arm 模板中的防火墙来保护我的 Cosmos 数据库帐户。我已使用门户来了解应如何编辑模板。
在门户中,我选择了复选框“接受来自公共 Azure 数据中心的连接”和“允许从 Azure 门户访问”。这会将以下 IP 地址添加到 ipRangeFilter 属性。
104.42.195.92
40.76.54.131
52.176.6.30
52.169.50.45
52.187.184.26
0.0.0.0
Run Code Online (Sandbox Code Playgroud)
我可以在arm模板中硬编码这些IP吗?或者它们将来会改变吗?除了 0.0.0.0 之外,我怀疑它们会改变。如果是的话,如何在不访问门户的情况下自动将这些IP添加到防火墙白名单中?
谢谢
azure azure-resource-manager azure-rm-template azure-cosmosdb
azure-cosmosdb ×10
azure ×3
arrays ×1
async-await ×1
c# ×1
database ×1
for-loop ×1
linq ×1
node.js ×1
paging ×1
partitioning ×1