检查文档是否存在并根据 CosmosDB 中的结果插入的最佳方法是什么?
What is the optimal way to check if document exists and insert based on outcome in CosmosDB?
我们在 CosmosDB 中使用跟踪 table 来识别 CosmosDB 中订单的状态。
{跟踪 ID、订单 ID、状态}
当状态为 Completed/InProgress 的订单没有记录时,我们需要在跟踪 table 中创建一个新文档。
目前,我们在下面的代码中访问了 Cosmos DB 两次。是否可以在 CosmosDB 中创建存储过程,并在插入新记录时创建 return 跟踪 ID,或者在订单处于 Completed/InProgress 状态时创建 return null?
public static void InsertTracking(string OrderID)
{
if(! IsOrderProcessedOrInProgress(OrderID))
{
var trackingID = CreateTracking(OrderID);
NotifyNewTracking(trackingID);
}
}
是的,这是可能的。您可以在 CosmosDB 中创建一个存储过程,并 return 通过使用条件语句应用检查来跟踪 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.Client 和 Microsoft.Azure.Documents[=27= 的引用来初始化文档客户端实例] 在你的 Program.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 DB and Stored Procedures 以获取更多信息。
我们在 CosmosDB 中使用跟踪 table 来识别 CosmosDB 中订单的状态。 {跟踪 ID、订单 ID、状态}
当状态为 Completed/InProgress 的订单没有记录时,我们需要在跟踪 table 中创建一个新文档。
目前,我们在下面的代码中访问了 Cosmos DB 两次。是否可以在 CosmosDB 中创建存储过程,并在插入新记录时创建 return 跟踪 ID,或者在订单处于 Completed/InProgress 状态时创建 return null?
public static void InsertTracking(string OrderID)
{
if(! IsOrderProcessedOrInProgress(OrderID))
{
var trackingID = CreateTracking(OrderID);
NotifyNewTracking(trackingID);
}
}
是的,这是可能的。您可以在 CosmosDB 中创建一个存储过程,并 return 通过使用条件语句应用检查来跟踪 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.Client 和 Microsoft.Azure.Documents[=27= 的引用来初始化文档客户端实例] 在你的 Program.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 DB and Stored Procedures 以获取更多信息。