0

symfony プロジェクトで MongoDB を使用しています。データベースへの通信には、Document Manager と MongoClient のいずれかを使用しています。

私がやろうとしているのは、配列をデータベースに直接バッチ挿入することです。配列を作成して埋めようとしました。ただし、batchInsert() を実行すると、この例外が発生します

[MongoException]    
 no documents given

マニュアルによると、挿入された配列が空の場合に例外がスローされるため、非常に混乱します。挿入する配列が空でないことを確認し、何度も試しました。これは私のコードです:

$dm = $this->getContainer()->get('doctrine_mongodb');

            echo "initiating... \n";

        $data = $dm->getRepository("KahviDocumentBundle:Suppliers")->findAll();

        $children = array();

        echo "fetched\n";

        echo "\n".count($data)."\n";

        $items = array();
        foreach ($data as $row) {
            foreach ($row->getValue()->getConsigneeName() as $consignee) {

                    $items[] = array(
                        'id' => Util\Util::slugify($consignee),
                        'name' => $consignee,
                        'data' => array(
                            'band' => $row->getValue()->getShipperName(),
                            'relation' => 'Buyer of band'
                        )
                    );

            }
            // echo $row->getValue()->getShipperName()."\n";
        }
        echo "items collected\n".count($items)."\n";


        foreach ($items as &$item) {
            $parent = $item['data'];
            $children[Util\Util::slugify($parent['band'])][] = &$item;
        }

        unset($item);

        foreach ($items as &$item) {
            if (isset($children[$item['id']])) {
                $item['children'] = $children[$item['id']];
            }

        }
        unset($item);

        // die();
        echo "start deleting\n";
        $mongo = new \MongoClient('mongodb://192.168.125.17:27017');

        $db = $mongo->selectDB('dbname');
        // print_r($db);
        $collection = $db->the_collection;
        // print_r($collection);
        $response = $collection->drop();

        echo "finished\n";
        print_r($response);
        // die();

        echo "starting recording\n";

        $newCollection = $db->createCollection(
            "the_collection",
            array(
                'capped' => true,
                'size' => 1024*1024,
                'max' => 10
            )
        );

        echo "children count ".count($children)."\n";

        $trees = array();
        foreach ($children as $key => $child) {

            $test = array(
                'id' => $key,
                'name' => $key,
                'children' => is_array($child) ? $child : array()
            );
            $serialized = serialize($test);
            $trees[] = $serialized;
            // echo $serialized."\n";
        }
        // die();
        var_dump($trees);
        $newCollection->batchInsert($trees);

        // $dm->getManager()->flush();

        echo "finished\n";
4

1 に答える 1