У меня есть три коллекции, я хочу переместить данные из коллекции 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));