首页 > 解决方案 > 使用 CosmosDB 数据迁移工具将多对多关系映射到字符串数组?

问题描述

我正在将一些数据从 Azure SQL 迁移到 CosmosDB。我正在使用 CosmosDB 数据迁移工具。在 SQL 数据库中,个人和收藏夹之间存在多对多关系。我想将收藏夹名称迁移到 CosmosDB 文档中的一个简单数组中。我还没有找到一种方法来做到这一点。文档建议我使用FOR JSON AUTO它将子查询转换为 JSON 对象数组。

以下是现在的查询。这不是我想要的。

SELECT 
    p.Id AS [id],
    p.FirstName AS [name.first],
    p.LastName AS [name.last],
    o.City AS [office.City],
    o.[State] AS [office.State], 
    c.ReminderEmailEnabled AS [reminderEmail], 
    (SELECT f.[Name] FROM dbo.Favorites f JOIN dbo.PersonFavorite pf ON pf.FavoriteId = f.Id AND pf.PersonId = p.Id  FOR JSON AUTO) AS [favorites]
FROM dbo.Persons p
    LEFT JOIN dbo.Offices o ON o.Id = p.OfficeId

使用此查询,CosmosDB 中生成的 JSON 文档如下所示:

{
    "name": {
        "first": "Donald",
        "last": "Duck"
    },
    "office": {
        "City": "Ann Arbor",
        "State": "MI"
    },
    "reminderEmail": true,
    "favorites": "[{\"Name\":\"Red\"},{\"Name\":\"Green\"}]",
    "id": "some guid",
}

它将它变成一个字符串,这就是为什么它然后添加转义字符,以及它的 JSON 对象数组。

我想要的是:

{
    "name": {
        "first": "Donald",
        "last": "Duck"
    },
    "office": {
        "City": "Ann Arbor",
        "State": "MI"
    },
    "reminderEmail": true,
    "favorites": ["Red","Green"],
    "id": "some guid",
}

如何使用数据迁移工具修改我的查询以实现此目的?

标签: sql-serverazureazure-cosmosdbdata-migration

解决方案


数据迁移工具无法处理此问题,但您可以使用 ADF 和 Databricks 执行此操作。我们最近在我们的 Cosmos DB 博客中写了一篇关于此的博文。

使用 Azure 数据工厂和 Azure Databricks 将关系数据迁移到 Azure Cosmos DB

希望这会有所帮助。


推荐阅读