我正在尝试使用新的部分文档更新功能来修补 Cosmos Db 文档的子对象。但是,我找不到办法做到这一点。
如果文档如下所示,如何使用新的 Patch 方法将 ID 为 2 ProductCode 属性的子项(在 Items 数组中)更新为“A-111”?
{
"id": "SalesOrder2",
"ponumber": "PO15428132599",
"OrderDate": "2005-07-01T00:00:00",
"DueDate": "2005-07-13T00:00:00",
"ShippedDate": "2005-07-08T00:00:00",
"AccountNumber": "Account2",
"SubTotal": 6107.082,
"TaxAmt": 586.1203,
"Freight": 183.1626,
"TotalDue": 4893.3929,
"DiscountAmt": 1982.872,
"Items": [
{
"Id": 1,
"OrderQty": 3,
"ProductCode": "A-123",
"ProductName": "Product 1",
"CurrencySymbol": "$",
"CurrencyCode": "USD",
"UnitPrice": 17.1,
"LineTotal": 5.7
},
{
"Id": 2,
"OrderQty": 2,
"ProductCode": "A-456",
"ProductName": "Product 2",
"CurrencySymbol": "$",
"CurrencyCode": "USD",
"UnitPrice": 10,
"LineTotal": 20
}
],
"_rid": "BsMkAMc43s4CAAAAAAAAAA==", …Run Code Online (Sandbox Code Playgroud) 我想通过以下查询从Cosmos DB中检索数据:
pi
(这是一个sql查询,我可以在mysql中使用)
这是pi一个字符串值.这可以是09001001或09025001.
那么有没有办法在Cosmos DB中使用like命令.我知道cosmos DB使用CONTAINS,但是当类似的通配符不在字符串的开头或结尾时,不能使用它.
我一直在关注这里的官方文档:https : //docs.microsoft.com/en-us/azure/cosmos-db/sql-api-get-started#Query
但是我不知道如何在 SQL 字符串上正确使用 LINQ 表达式。我尝试了 GetItemLinqQueryable,但我不知道使用它是否正确。也不是异步的。
var db = Client.GetDatabase(databaseId);
var container = db.GetContainer(containerId);
var q = container.GetItemLinqQueryable<Person>();
var result = q.Where(p => p.Name == "Name").ToList();
Run Code Online (Sandbox Code Playgroud)
这是将 LINQ 与 Cosmos v3 一起使用的正确方法,以及如何使其异步?
我将 Spring Boot 应用程序与 azure CosmosDB-SQL API 集成在一起,对于集成测试用例,我想在内存数据库中使用,但尝试在内存中使用 H2 它不起作用
我可以UPDATE为 Azure Cosmos DB编写语句吗?SQL API 支持查询,但更新呢?
特别是,我希望更新文档而不必检索整个文档。我有文档的 ID,我知道我想在文档中更新的确切路径。例如,假设我的文档是
{
"id": "9e576f8b-146f-4e7f-a68f-14ef816e0e50",
"name": "Fido",
"weight": 35,
"breed": "pomeranian",
"diet": {
"scoops": 3,
"timesPerDay": 2
}
}
Run Code Online (Sandbox Code Playgroud)
我想更新diet.timesPerDay到 ID 所在的 1 "9e576f8b-146f-4e7f-a68f-14ef816e0e50"。我可以在不完全替换文档的情况下使用 Azure SQL API 做到这一点吗?
假设我的容器中有以下数据:
{
"id": "1DBF704E-1623-4844-DC86-EFA729A5C048",
"firstName": "Wylie",
"lastName": "Ramsey",
"country": "AZ",
"city": "Tucson"
}
Run Code Online (Sandbox Code Playgroud)
当我查询特定分区键时,我使用字段“id”作为项目 id,使用字段“country”作为分区键:
SELECT * FROM c WHERE c.country = "AZ"
Run Code Online (Sandbox Code Playgroud)
(获取“AZ”中的所有人员)
我应该添加“国家/地区”作为索引,还是默认获得它,因为我将“国家/地区”作为分区键?使用 SDK 时是否有区别(即:添加选项new PartitionKey("AZ"),然后发送如上所述的查询)?
如果转到https://portal.azure.com,打开我们的 Azure Cosmos DB 帐户 (1) --> 数据资源管理器 (2) --> 单击用户 (3) --> 单击新建 SQL 查询:
Azure 将打开一个文本框以输入查询:
我发现 Cosmos DB 不允许使用 DELETE 代替 SELECT: /sf/answers/3383744171/,所以我应该这样做:
SELECT * FROM c DELETE c
SELECT * FROM c DELETE *
Run Code Online (Sandbox Code Playgroud)
但是我的任何尝试都奏效了。
我有一个 API (.NET Core 2.2),它使用 SDK v3.5.0 从 Cosmos DB 检索文档。目前,由于对 Cosmos DB 的请求超时,一些请求会引发异常 - 响应是408 状态代码。值得一提的是,90% 的请求都被成功处理。
使用遥测记录 API 的活动,我注意到在依赖项表(记录对 Cosmos DB 的每个请求)中,持续时间超过 60 秒的请求是由名为“创建/查询文档”的命令发起的。这些是属于超时的请求。
另一方面,所有其他请求都使用“查询文档”命令,该命令在 < 5 秒内响应并且请求成功完成。为了分享更多上下文,我在下面详细说明了错误堆栈跟踪、一般规范以及我如何查询文档。
堆栈跟踪
Microsoft.Azure.Cosmos.CosmosException : Response status code does not indicate success: 408 Substatus: 0 Reason: (Microsoft.Azure.Cosmos.CosmosException : Response status code does not indicate success: 408 Substatus: 0 Reason: (Microsoft.Azure.Documents.RequestTimeoutException: GatewayStoreClient Request Timeout. Start Time:1/30/2020 4:18:00 AM; Total Duration:00:01:05.0332130; Http Client Timeout:00:01:05; Activity id: 7498789a-8e09-4c3e-96a6-31c32e4dc2d7; Inner Message: The …Run Code Online (Sandbox Code Playgroud) 我想减少 Azure Cosmos DB SQL-API 的负载,该 API 通过依赖项注入从 .NET Core Web API 调用。
在 App Insights 中,我注意到每次调用 Web API 都会导致对 Cosmos 的 GetDatabase 和 GetCollection 调用,当 Cosmos 负载较重时,这可能需要 5 秒才能运行。
我做了CosmosClient一个单例(例如这里的建议 - https://learn.microsoft.com/en-us/azure/cosmos-db/performance-tips-dotnet-sdk-v3-sql)
然而,我找不到任何关于Database或Container对象是否也可以是单例的建议,因此它们是为每个对 Web API 的请求创建的。
我检查数据库和集合是否存在(例如,遵循此处的建议 - https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.cosmosclient.getdatabase?view=azure-dotnet#备注和https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.cosmosclient.getcontainer?view=azure-dotnet#remarks)
这意味着对于 Web API 的每个请求,都会运行以下代码
var databaseResponse = await this.cosmosClient.CreateDatabaseIfNotExistsAsync(
this.databaseConfiguration.DatabaseName,
throughput: this.databaseConfiguration.DatabaseLevelThroughput);
var database = databaseResponse.Database;
var containerResponse = await database.CreateContainerIfNotExistsAsync(containerId, partitionKey);
var container = containerResponse.Container;
Run Code Online (Sandbox Code Playgroud)
我可以创建单例Database并将Container …
我正在尝试编写一个包含 IN 子句的参数化查询。
对于前:
工作代码
输入字符串:“'guid1','guid2','guid3'”
public List<Employee> GetEmployeeIds(string ids){
QueryDefinition query =new QueryDefinition(@"Select * from Employee where Employee.Id in ("+ ids+")");
var result = GetDetails(query,cosmosClient);
return result;
}
Run Code Online (Sandbox Code Playgroud)
结果:返回预期结果
非工作代码
输入字符串:“'guid1','guid2','guid3'”
public List<Employee> GetEmployeeIds(string ids){
QueryDefinition query =new QueryDefinition(@"Select * from Employee where Employee.Id in ( @ids )")
.WithParameter("@ids", ids);
var result = GetDetails(query,cosmosClient);
return result;
}
Run Code Online (Sandbox Code Playgroud)
结果:返回0
上述代码使用的NuGet包: Microsoft.Azure.Cosmos 3.8.0
注意:我已尝试此链接中提到的所有选项,但它不适用于 CosmosClient QueryDefinition 对象 WHERE IN 与 Azure DocumentDB (CosmosDB) .Net SDK
对此的任何帮助都将受到高度赞赏。
提前致谢。!!
.net c# azure-cosmosdb azure-cosmosdb-sqlapi asp.net-core-3.1