c# - 检查文档是否存在并根据 CosmosDB 中的结果插入的最佳方法是什么?

标签 c# azure azure-cosmosdb azure-cosmosdb-sqlapi

我们使用 CosmosDB 中的跟踪表来识别 CosmosDB 中订单的状态。 {跟踪ID、订单ID、状态}

当状态为“已完成”/“进行中”的订单没有记录时,我们需要在跟踪表中创建一个新文档。

目前,我们在下面的代码中访问了 Cosmos DB 两次。是否可以在 CosmosDB 中创建一个存储过程,并在插入新记录时返回跟踪 id,或者在订单处于已完成/进行中状态时返回 null?

public static void InsertTracking(string OrderID)
{
    if(! IsOrderProcessedOrInProgress(OrderID))
    {
        var trackingID = CreateTracking(OrderID);
        NotifyNewTracking(trackingID);
    }
}

最佳答案

是的,这是可能的。您可以在 CosmosDB 中创建存储过程,并通过使用条件语句应用检查来返回跟踪 ID 或 NULL。

涉及 Cosmos DB 上下文时,存储过程是用 JavaScript 编写的。它们在集合级别编写和存储,并提供安全的事务环境来执行复杂的操作序列。

您可以编写存储过程,如下面的示例代码片段所示。

function checkIfNotExists(orderID) {
    var collection = getContext().getCollection();
    var response = getcontext().getResponse();
    
    // Query documents
    var query = 'SELECT * FROM o WHERE o.orderID="' + orderID + '"';
    var isStatus = collection.queryDocuments(...) {
            ...
            //run you condition to check and
            // update the response respectively.
    }
}

之后,您必须通过在 中添加对 Microsoft.Azure.Documents.ClientMicrosoft.Azure.Documents 的引用来初始化文档客户端实例程序.cs。然后您可以按照如下所示的方式执行存储过程。

//Read Stored Procedure
var sprocBody = File.ReadAllText(@"..\..\StoredProcedures\checkIfNotExists.js");
//Create SP definition
var spDefinition = new StoredProcedure
{
    Id = "checkIfNotExists",
    Body = sprocBody
};

//Create a Store Procedure
StoredProcedure sproc = await client.CreateStoredProcedureAsync(UriFactory.CreateDocumenCollectionUri("dbFamily", "Families"), spDefinition);
Console.WriteLine($"\r\nCreated Store procedure Id:{sproc.Id} ");

//Execute Store Procedure
 var result = await client.ExecuteStoredProcedureAsync<string>  (UriFactory.CreateStoredProcedureUri("dbFamily", "Families", "spHelloWorld"));
 Console.WriteLine($"Executed Store Procedure: response:{result.Response}");

另请注意,正如 @sellotape 所说,您需要在 SP 的每次执行中保持相同的分区键。遵循上述所有步骤后,您应该能够实现您想要的结果。我建议阅读Stored Procedures In Azure Cosmos DBStored Procedures了解更多信息。

关于c# - 检查文档是否存在并根据 CosmosDB 中的结果插入的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70043211/

相关文章:

c# - 如何获取 DataAnnotation 显示名称?

c# - 如何使用 Razor 和 .NET Core 将项目添加到 ViewModel 中的列表?

azure - 如何在Azure下创建纯重定向HTTP站点?

azure - 设置 az cli,但是由于最大重试次数失败,我无法连接,目标主机拒绝连接。如何在 Windows 中绕过我的代理?

azure - Azure 中的 DocumentDB(通过 MongoDB 协议(protocol))集合大小限制

c# - IDocumentQuery 中 documentdb linq 查询中的 OrderBy

sql - 带/不带 "ORDER BY"的 CosmosDB sql 查询返回不同数量的项目

c# - 新的 C#7 模式匹配和可达性

c# - 从另一个项目访问 Razor View

azure - 无法创建架构扩展