Microsoft Cosmosdb для Mongodb: объединить неотмеченные коллекции в разрозненные - PullRequest
0 голосов
/ 06 января 2020

У меня есть 2 коллекции схожих документов (т.е. один и тот же объект, разные значения). Одна коллекция (X) не хранится в базе данных A, другая коллекция (Y) отбрасывается и находится в базе данных B. Когда я пытаюсь скопировать коллекцию X в базу данных B, я получаю сообщение об ошибке, в котором говорится, что «Общая коллекция пропускной способности должна иметь ключ раздела». Я также пытался копировать данные с использованием вставки foreach, но это занимает слишком много времени.

Поэтому мой вопрос заключается в том, как эффективно добавить данные из коллекции X в коллекцию Y?

Mongodb версия на CosmosDB - 3.4.6

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Итак, мой вопрос: как я могу эффективно добавить данные из коллекции X в коллекцию Y?

Серверные инструменты mongodump и mongorestore можно использовать. Вы можете экспортировать данные исходной коллекции в файлы дампа BSON и импортировать в целевую коллекцию. Эти процессы выполняются очень быстро, поскольку данные в базе данных уже представлены в формате BSON.

Данные можно экспортировать из незащищенной коллекции в защищенную коллекцию с помощью этих инструментов. В этом случае требуется, чтобы исходная коллекция имела поле шард-ключа (или поля) со значениями. Обратите внимание, что индексы из исходной коллекции также экспортируются и импортируются (с использованием этих инструментов).

Вот пример рассматриваемого сценария:

mongodump --db=srcedb --collection=srcecoll --out="C:\mongo\dumps"

Это создает каталог дампа с именем базы данных. В нем будет файл "srcecoll.bson", и он будет использоваться для импорта.

mongorestore --port 26xxxx --db=trgtdb --collection=trgtcoll --dir="C:\mongo\dumps\srcecoll.bson"

Хост / порт подключается к mongos сегментированного кластера. Обратите внимание, что имя файла bson должно быть указано в опции --dir.

При импорте данные и индексы добавляются в существующую защищенную коллекцию. Процесс только вставляет данные; существующие документы не могут быть обновлены. Если значение _id из исходной коллекции уже существует в целевой коллекции, процесс не будет перезаписывать документы (и эти документы не будут импортированы, и это не является ошибкой).

Для mongorestore есть несколько полезных опций, например: --noIndexRestore и --dryRun.

0 голосов
/ 21 января 2020

Поскольку версия MongoDb в CosmosDB в настоящее время 3.4.6, она не поддерживает $ merge и множество других команд, таких как colleciton.copyTo et c. Использование функции импорта Studio 3T также не помогло.

Решение, которое я использую, состоит в том, чтобы загрузить целевую коллекцию на мой локальный mongodb, очистить ее, а затем написать java код, который будет считывать мои чистые данные из локальной базы данных и вставлять их (или навалом) в целевую коллекцию , Таким образом, данные будут добавлены в целевую коллекцию. Скорость, которую я измерил, составляла 2 часа для количества документов 1 м (~ 750 МБ), конечно, эти цифры могут варьироваться в зависимости от различных факторов, например, сети, размера документа и c.

0 голосов
/ 06 января 2020

Вы можете выполнить агрегирование и добавить в качестве последнего этапа оператор $merge.

| $merge                                | $out                                       | 
| Can output to a sharded collection.   | Cannot output to a sharded collection.     | 
| Input collection can also be sharded. | Input collection, however, can be sharded. | 

https://docs.mongodb.com/manual/reference/operator/aggregation/merge/#comparison -без

...