web-dev-qa-db-fra.com

comment ignorer les documents en double lors de l'utilisation de insertMany dans la bibliothèque php de mongodb?

J'utilise bibliothèque php mongo , et j'essaie d'insérer d'anciennes données dans mongodb. J'ai utilisé la méthode insertMany() et je passe un énorme tableau de documents, qui peuvent avoir des documents en double sur des index uniques.

Disons que j'ai une collection d'utilisateurs et que j'ai ces index:

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.users"
    },
    {
        "v" : 1,
        "unique" : true,
        "key" : {
            "email" : 1
        },
        "name" : "shop_id_1_title_1",
        "ns" : "test.users"
    }
]

S'il y a un document en double, MongoDB\Driver\Exception\BulkWriteException augmenterait et arrêterait le processus. Je veux trouver un moyen d'ignorer l'insertion de documents en double (et également d'empêcher l'exception de se lever) et de continuer à insérer d'autres documents.

J'ai trouvé dans la documentation php.net un indicateur appelé continueOnError qui fait l'affaire, mais il semble que cela ne fonctionne pas avec cette bibliothèque.

L'exemple de php.net:

<?php

$con = new Mongo;
$db = $con->demo;

$doc1 = array(
        '_id' => new MongoId('4cb4ab6d7addf98506010001'),
        'id' => 1,
        'desc' => "ONE",
);
$doc2 = array(
        '_id' => new MongoId('4cb4ab6d7addf98506010002'),
        'id' => 2,
        'desc' => "TWO",
);
$doc3 = array(
        '_id' => new MongoId('4cb4ab6d7addf98506010002'), // same _id as above
        'id' => 3,
        'desc' => "THREE",
);
$doc4 = array(
        '_id' => new MongoId('4cb4ab6d7addf98506010004'),
        'id' => 4,
        'desc' => "FOUR",
);

$c = $db->selectCollection('c');
$c->batchInsert(
    array($doc1, $doc2, $doc3, $doc4),
    array('continueOnError' => true)
);

Et la façon dont j'ai essayé d'utiliser le drapeau avec bibliothèque mongo php :

<?php

$users = (new MongoDB\Client)->test->users

$collection->insertMany([
    [
        'username' => 'admin',
        'email' => 'admin@example.com',
        'name' => 'Admin User',
    ],
    [
        'username' => 'test',
        'email' => 'test@example.com',
        'name' => 'Test User',
    ],
    [
        'username' => 'test 2',
        'email' => 'test@example.com',
        'name' => 'Test User 2',
    ],
],
[
    'continueOnError' => true    // This option is not working
]);

Le code ci-dessus soulève toujours l'exception et ne semble pas fonctionner. Existe-t-il un autre indicateur d'option ou existe-t-il un moyen de le faire?

18
Behzadsh

Essayez de remplacer l'option 'conntinueOnError' par 'ordonné' défini sur false, sur la base de la documentation, lorsque l'option ordonnée est définie sur false, insertMany continuera à écrire, même si une seule écriture échoue.

voici le lien docs: insertMany

14
YouneL