自定义BotState存储 - 删除旧状态数据条目

时间:2018-01-29 16:05:14

标签: c# .net botframework azure-cosmosdb

我已成功实施自定义bot状态服务,使用following article将状态数据存储到我的Azure Cosmos数据库中。然而,我注意到,状态数据集合可能会变得相对较大,尤其是记录数量。

我想实施一项计划任务,该计划任务将删除与begin declare @OperatingCashflow5 int declare @OperatingCashflow3 int declare @result5 int select @OperatingCashflow5 = AVG(hpd.TotalCashFromOperations) from HistoricalFinPerformanceDataStagingGlobal hpd where hpd.companyid = @companyid select @OperatingCashflow3 = AVG(hpd.TotalCashFromOperations) from ( select top (3) hpd.TotalCashFromOperations from HistoricalFinPerformanceDataStagingGlobal hpd where hpd.companyid = @companyid ) hpd -- <<<< Need a name here if @OperatingCashflow5 <= 0 OR @OperatingCashflow3 <= 0 begin select @result5 = 1 end else begin select @result5 = 0 end end ConversationData相关的所有状态数据条目(例如),同时保持PrivateConversationData不受影响。要比较我正在考虑使用Cosmos DB系统属性UserData的时间戳。

问题:

  1. 是否有现成的开箱即用解决方案?我正在考虑调整_ts命令,但是根据source code它似乎使用了/deleteProfile调用,这些调用没有物理删除数据库条目。
  2. 有一种简单的方法可以区分各种类型的状态数据吗?看起来像正则表达式是唯一的选择。
  3. 除了丢失州数据外会不会有任何后果?

1 个答案:

答案 0 :(得分:2)

  

是否存在开箱即用的解决方案?

目前,在Bot SDK中,我找不到任何可用于删除比cosmos db指定的日期时间更早的状态数据的方法/函数。

  

有一种简单的方法可以区分各种类型的状态数据吗?

如果检查存储在cosmos数据库中的数据(文档),您会发现文档的ID以特定模式保存,例如: ConversationData 的文档,标识为{{1以及标识为<channel>:conversation<conversation ID> PrivateConversationData 的文档。如您所述,您可以使用正则表达式来匹配和检测状态数据的类型。

您可以参考此正则表达式和下面的示例代码来删除旧文档。

<channel>:private<conversation ID>:<user ID>

示例代码:

string pattern = @"(:conversation)|(:private)";
System.Text.RegularExpressions.Regex rgx = new System.Text.RegularExpressions.Regex(pattern);

我的User-defined functions(ToDate):

string EndpointUrl = "https://xxxx.documents.azure.com:443/";
string PrimaryKey = "{your_key}";
DocumentClient client = new DocumentClient(new Uri(EndpointUrl), PrimaryKey);

FeedOptions queryOptions = new FeedOptions { MaxItemCount = -1 };

DateTime dtn = new DateTime(2018, 1, 25);

IQueryable<Document> DocQueryInSql = client.CreateDocumentQuery<Document>(
        UriFactory.CreateDocumentCollectionUri(databaseName, collectionName),
        "SELECT * FROM c WHERE udf.ToDate(c._ts) < '"+ dtn.ToString("yyyy-MM-dd") + "'",
        queryOptions);

string pattern = @"(:conversation)|(:private)";
System.Text.RegularExpressions.Regex rgx = new System.Text.RegularExpressions.Regex(pattern);

foreach (Document doc in DocQueryInSql)
{
    if (rgx.Matches(doc.Id).Count>0)
    {
        //Console.WriteLine("\tRead {0}", doc.Id);

        await client.DeleteDocumentAsync(UriFactory.CreateDocumentUri("{your_db_name}", "{your_collection_name", doc.Id));
    }
}
  

除了丢失州数据外会不会有任何后果?

这取决于您要使用这些状态数据的内容,如果您检索状态数据但已被删除,这可能会导致异常或某些功能无法正常工作。

注意:

  • 要运行计划任务,您可以尝试Azure WebJobs或功能
  • 有关运行cosmos db的更多详细信息,请查看this article