Найти различия между списком UUID MongoDB и списком SQL направляющих - PullRequest
0 голосов
/ 27 февраля 2020

Справочная информация:

У меня есть исходная база данных MongoDB, содержащая данные транзакций в документах, и они имеют стандартное поле "_id" в качестве индекса.

У меня также есть база данных отчетов SQL SSRS для тех же данных транзакций, из которых я создаю извлечения данных.

Часть проверки для извлечения, который должен быть создан, - это проверка количества записи между источником и базой данных отчетов. Это в настоящее время не позволяет сказать, что у меня есть одна дополнительная запись в моей базе данных отчетов для определенного диапазона клиентов / дат.

База данных отчетов также имеет то же поле "_id", что и первичный ключ в своих таблицах с именем "TransactionId ".

Базы данных отчетов MongoDB и SQL также имеют концепцию CreationTimestamp, которая является общей для обеих баз данных на уровне транзакций.

Вопрос:

Используя запросов к базе данных , как мне найти дополнительную запись в SQL, которой нет в моей исходной коллекции MongoDB?

Также было бы удобно сделать это наоборот (в MongoDB, но не в SQL), что, вероятно, будет более распространенным явлением.

1 Ответ

0 голосов
/ 28 февраля 2020

Я не получил здесь ответа, поэтому сам работал над этим. Я опубликую решение здесь, но я был бы очень рад увидеть любые альтернативные / лучшие решения, поскольку это немного неуклюже.

Найти и отсортировать UUID MongoDB между 2 датами

// This should match the “Source count” in my logs
db.getCollection('My_Mongo_Collection')
    .find({"CreationTimestamp" : {$gte : ISODate('2020-02-18T00:00:00.000Z'), $lte : ISODate('2020-02-27T23:59:59.999Z')}})
    .count()

// This will find and sort the “_id” UUIDs of the documents within the date range
var cursor = db.getCollection('My_Mongo_Collection')
    .find({"CreationTimestamp" : {$gte : ISODate('2020-02-18T00:00:00.000Z'), $lte : ISODate('2020-02-27T23:59:59.999Z')}}, {"_id": 1})
    .sort({"CreationTimestamp" : -1})

// This will format the resulting UUIDs into a format that SQL expects for insertion into a temporary table
cursor.forEach(function(user){
    var str = user._id.valueOf()+",";
    print(
        str.replace("UUID(\"", "('")
          .replace("\"),", "'),"));
});

Найти дополнительный / отсутствующий UUID в SQL

--DROP TABLE #temp

-- This will create a temporary table in memory
CREATE TABLE #temp (
id VARCHAR(50))

-- Insert the formatted UUIDs from the Mongo script query. This will create a temporary 
-- table in memory
INSERT INTO #temp
VALUES 
('238832d1-d0ab-4dc3-80cb-ab6d00b811ae'),
('00ceef1e-1b9e-4f1f-a8d8-ab6d00b811ae'),
...

-- When inserting more than 1000 records the following error will be seen. 
-- Msg 10738, Level 15, State 1, Line 2011
-- The number of row value expressions in the INSERT statement exceeds the maximum allowed 
-- number of 1000 row values.

-- Click on the error and continue like so, deleting the comma above the error and creating 
-- a second insert statement for the second 1000 records, run the query again to get the 
-- next 1000 error and keep repeating this cycle until you get to the last record:
('7c505e5e-41b4-4e40-9044-ab6d00b811ae'),
('5f197206-b218-4785-9f0f-ab6d00b811ae')

INSERT INTO #temp
VALUES 
('a9d174e9-a30a-42b5-8815-ab6d00b811ae'),
('72c728e6-0c57-4109-89ca-ab6d00b811ae')
. . .

-- Delete the trailing comma off the last record like so and run the CREATE and INSERT 
-- statements.
('672af0f6-d643-4101-acb3-ab6500fc539c'),
('78bf2c9f-20b4-4fa2-8c06-ab6500fc539c')

Найти дополнительный в MongoDB, но не в SQL

-- Find extra records in Mongo that are not in SQL
SELECT * FROM #temp 
WHERE id NOT IN 
       (SELECT TransactionId FROM My_Reporting_Table)

Найти дополнительные в SQL, но не в MongoDB

-- Find extra records in SQL that are not in Mongo
SELECT * FROM My_Reporting_Table
WHERE TransactionId NOT IN
       (SELECT id FROM #temp) AND CreationTimestamp BETWEEN '2020-02-19 00:00:00.000' AND '2020-02-28 23:59:59.999'

ПРИМЕЧАНИЕ. Пн go чувствителен к регистру и использует только строчные UUID, SQL - нет чувствительны к регистру и могут использовать строчные или прописные UUID.

Нет разницы между UUID и GUID Есть ли разница между GUID и UUID?

...