我已成功实施自定义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
的时间戳。
问题:
_ts
命令,但是根据source code它似乎使用了/deleteProfile
调用,这些调用没有物理删除数据库条目。答案 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));
}
}
除了丢失州数据外会不会有任何后果?
这取决于您要使用这些状态数据的内容,如果您检索状态数据但已被删除,这可能会导致异常或某些功能无法正常工作。
注意: