Копирование между коллекциями, отфильтрованными третьей коллекцией, в другую базу данных с помощью mongoDB - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть три коллекции, я хочу переместить данные из коллекции A в B, отфильтрованные по коллекции C, которая находится в другой базе данных.

Проблема заключается в том, что MongoDb завершается ошибкой, независимо от того, что запрос не может переместить более 100 документов и произойдет сбой, я думаю, что мне нужен оптимизированный запрос, я делаю это:

db.getSiblingDB('OTHERDATABASE').C.find().forEach(function (d) {
      db.getCollection('A').find({_id:d._id}).forEach(function (x) {
        db.getCollection('B').insert(x);
   })
});

При следующем вопросе произошел сбой с ошибкой сети, я решил с помощью этого PHP-скрипта:

$client=new MongoDB\Client(MONGODB);

$databaseab  = $client->selectDatabase("DATABASAB");

$databasec  = $client->selectDatabase("DATABASEC");

$A = $databaseab->selectCollection("A");

$B     = $databaseab->selectCollection("B");

$C    = $databasec->selectCollection("C");

$list = $C->distinct("_id");

do
{
    $split = [];
    $count = 0;

    while (($line = array_shift($list)) AND $count++ <= 500)
    {
        $split[] = $line;
    }

    $result = $A->find([
        '_id' => [
            '$in' => $split     
        ]   
    ]);

    foreach ($result as $document)
    {
        $B->findOneAndUpdate(
            [
                '_id' => $document['_id']
            ],
            [
                '$setOnInsert' => $document
            ],
            [
                'upsert' => TRUE
            ]
        );

    }

    $A->deleteMany([
        '_id' => [
            '$in' => $split
        ]   
    ]);

} while (count($list));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...