如何在Azure Cosmos DB中“合并”或“转换” JSON文档

时间:2019-02-05 18:28:37

标签: json database azure botframework azure-cosmosdb

我正在使用Microsoft Bot Framework和Azure建立一个聊天机器人。我想将“ UserState”保存在数据库中,以便轻松分析用户数据。我设法将我的userState以JSON文档的形式保存在Azure Cosmos DB中。

问题是与机器人的每次交互都在Cosmos DB的“集合”中创建了一个新的“文档”。

如何轻松合并数据(数据结构是一致的),并且在最佳情况下将数据存储在某种表中?我要用于分析的工具需要.txt或.csv文件。

enter image description here

这是存储用户数据的JSON文件的代码段。

{
    "id": "emulator*2fusers*2f9321b527-4699-4b4a-8d9d-9cd9fa8f1967*2f",
    "realId": "emulator/users/9321b527-4699-4b4a-8d9d-9cd9fa8f1967/",
    "document": {
        "userData": {
            "name": "value",
            "age": 18,
            "gender": "value",
            "education": "value",
            "major": "value"
        },
        "userDataExtended": {
            "roundCounter": 3,
            "choices": [
                "A",
                "A",
                "B"
            ],
        },
    "_rid": "0k5YAPBrVaknAAAAAAAAAA==",
    "_self": "dbs/0k5YAA==/colls/0k5YAPBrVak=/docs/0k5YAPBrVaknAAAAAAAAAA==/",
    "_etag": "\"ac009377-0000-0000-0000-5c59c5610000\"",
    "_attachments": "attachments/",
    "_ts": 1549387105
}

在最佳情况下,我想将数据包含在具有“名称”,“年龄”等列以及每个用户(文档)为一行的表结构中。

谢谢!

2 个答案:

答案 0 :(得分:1)

您的问题中有几件事,我将分别解决。

扩展Drew的评论:

您正在创建多个文档,因为您正在通过模拟器运行机器人。模拟器每次重新启动时,都会创建一个新的用户ID,从而为该用户创建一个新文档,并为该用户的会话创建一个新文档。如果您使用仿真器以外的其他渠道,则只要用户ID保持一致,就不会出现此问题。

关于合并文档:

我不确定您要查找的是什么,但是您可以使用SQL Queries完成所需的操作。只需单击“新建SQL查询”。例如,运行SELECT * FROM c将所有文档合并到一个输出中。

enter image description here

关于文本/ csv文件:

我不确定您的工具是什么,但是如果它可以处理JSON,那么上面的方法可能对您有用。如果没有,则可以实现自定义中间件来获取所需的txt / csv输出。 Here's a sample显示相对相似的内容。 C#中没有等效的示例,但是您仍然可以implement your own middleware做同样的事情。

关于表格:

如果您真的正在寻找Table Storage,it was supported in V3机器人,但是在V4中已被Blob存储取代。您可以在V3中编写您的机器人。与Jay所说的类似,您也许仍然可以使用触发函数将其发送到表存储,但是随后您将数据存储了两次。

关于分析

如果您真正想要的只是分析,Application Insights/Bot Analytics可能就是您所需要的,尽管我不相信它会提供您想要的详细信息。

答案 1 :(得分:0)

  

在最好的情况下,我想将数据包含在表结构中   列“名称”,“年龄”等,每个用户(文档)排成一行。

显然,您需要使用其他一些服务来实现此要求,因为由bot服务收集的数据已经存在。

我认为,cosmos db trigger azure function也许对您来说是一个不错的选择。当任何更新流入您的cosmos db集合时,将触发该功能。

当然,您可以从此link得到更多的解释,然后我想说的是,您可以配置Cosmos db as input bindingAzure Blob Storage as output binding(也许是一个特定的csv文件)。在该函数中,您可以使用cosmos db sdk获取所需的列,并将其组合为所需的任何格式。