Скопируйте вложенные объекты из SQL Server в Azure CosmosDB с помощью фабрики данных - PullRequest
0 голосов
/ 15 января 2019

Допустим, у меня есть следующая структура данных:

public class Account
{
    public int AccountID { get; set; }
    public string Name { get; set; }
}

public class Person
{
    public int PersonID { get; set; }
    public string Name { get; set; }
    public List<Account> Accounts { get; set; }
}

Я хочу переместить мои данные из базы данных SQL Server в Azure Cosmos DB с помощью фабрики данных.Для каждого человека я хочу создать файл json, содержащий учетные записи в виде вложенных объектов, например:

"PersonID": 1,
"Name": "Jim",
"Accounts": [{
    "AccountID": 1,
    "PersonID": 1,
    "Name": "Home"
},
{
    "AccountID": 2,
    "PersonID": 1,
    "Name": "Work"
}]

Я написал хранимую процедуру для извлечения своих данных.Чтобы включить учетные записи как вложенные объекты, я преобразовываю результат запроса SQL в json:

select (select *
from Person p join Account Accounts on Accounts.PersonID = p.PersonID
for json auto) as JsonResult

К сожалению, мои данные копируются в одно поле вместо правильной структуры объекта:

enter image description here

Кто-нибудь знает, что я должен сделать, чтобы это исправить?

Редактировать Есть подобный вопрос здесь, но я не сделал 'Не могу найти хороший ответ: Есть ли способ вставить документ с вложенным массивом в фабрику данных Azure?

1 Ответ

0 голосов
/ 29 января 2019

Для всех, кто находился в такой же ситуации, я написал приложение .net для чтения записей из базы данных и импорта с использованием SQL API.

https://docs.microsoft.com/en-us/azure/cosmos-db/create-sql-api-dotnet

Этот метод немного медленный для больших импортов, потому что он должен сериализовать каждый объект, а затем импортировать их по отдельности. Более быстрый способ, который я обнаружил позже, - это использовать библиотеку массового исполнения, которая позволяет вам импортировать json навалом без предварительной сериализации:

https://github.com/Azure/azure-cosmosdb-bulkexecutor-dotnet-getting-started

https://docs.microsoft.com/en-us/azure/cosmos-db/bulk-executor-overview

Редактировать

После установки пакета NuGet Microsoft.Azure.CosmosDB.BulkExecutor:

var documentClient = new DocumentClient(new Uri(connectionConfig.Uri), connectionConfig.Key);
var dataCollection = documentClient.CreateDocumentCollectionQuery(UriFactory.CreateDatabaseUri(database))
    .Where(c => c.Id == collection)
    .AsEnumerable()
    .FirstOrDefault();

var bulkExecutor = new BulkExecutor(documentClient, dataCollection);
await bulkExecutor.InitializeAsync();

Затем импортируйте документы:

var response = await client.BulkIMportAsync(docunemts);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...