如何使用Cosmos DB数据迁移工具

时间:2017-08-31 12:20:11

标签: sql-server azure azure-cosmosdb database nosql

我正在尝试从SQL Server数据库导入文档。每个文档都有一个客户购买的产品列表,例如:

    {
        "name": "John Smith"
        "products": [
             {
                 "name": "Pencil Sharpener"
                 "description": "Something, this and that."
             },
             { 
                 "name": "Pencil case"
                 "description": "A case for pencils."
             }
        ]
    }

在SQL Server数据库中,客户和产品存储在单独的表中,客户和产品之间具有一对多的关系:

客户

Id INT
Name VARCHAR

产品

Id INT
CustomerId INT (FK)
Name VARCHAR
Description VARCHAR

我已经通过documentation 进行了检查,但是看不到有关如何编写SQL查询以将一对多关系映射到单个文档的任何提及。

我认为可能有一种方法可以像目标信息步骤那样(当选择 DocumentDB - 批量导入(单个分区集合)时)可以选择提供bulk insert stored procedure。也许产品可以从那里分配到文档的产品阵列。我只是不确定如何去做,因为我是Cosmos DB的新手。

我希望这很清楚,并提前感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

import data from SQL Server using the Azure Cosmos DB: DocumentDB API Data Migration tool似乎想要返回格式为json的产品信息。根据您的 客户 产品 表格结构和您的要求,我执行以下测试,该测试正常我这边。你可以参考它。

将数据从SQL Server导入JSON文件

enter image description here

enter image description here

<强>查询

select distinct c.Name, (SELECT p.Name as [name], p.[Description] as [description] from [dbo].[Product] p where c.Id = p.CustomerId for JSON path) as products 
from [dbo].[Customer] c

JSON输出

[
  {
    "Name": "Jack",
    "products": null
  },
  {
    "Name": "John Smith",
    "products": "[{\"name\":\"Pencil Sharpener\",\"description\":\"Something, this and that\"},{\"name\":\"Pencil case\",\"description\":\"A case for pencils.\"}]"
  }
]

解析产品

在“目标信息”步骤中,您需要使用自己的BulkTransformationInsert.js版本。第32行是'transformDocument'功能,您可以在其中编辑文档。以下内容将解析产品,然后在返回之前将它们分配回文档;

function transformDocument(doc) {
    if (doc["products"]) {
        let products = doc["products"];
        let productsArr = JSON.parse(products);
        doc["products"] = productsArr;
    }

    return doc;
}