带有消息的未捕获异常'MongoCursorException'....重复键错误索引:

时间:2013-07-11 08:50:27

标签: mongodb indexing key duplicates

这是我的代码:

当我尝试使用它时,会出现错误:

 "Fatal error: Uncaught exception 'MongoCursorException' with message
 'localhost:27017: E11000 duplicate key error index: 
  futbol_db.maclar.$kod_1_link_1 dup key:
  { : null, : null }' in /var/www/html/cagkansokmen/futbol/db/maclar.php:182 
  Stack trace: #0 /var/www/html/cagkansokmen/futbol/db/maclar.php(182):    
  MongoCollection->insert(Array) #1 {main} thrown in 
  /var/www/html/cagkansokmen/futbol/db/maclar.php on line 182"

问题在于插入。因为,当我删除插入代码时,这个代码没有问题。但是,如果我尝试插入数据,就像我说的那样出现错误。

我该如何解决?

$collection1 = $db->lig_kod;
$collection_maclar = $db->maclar;
    $collection1->ensureIndex(array("kod" => 1, "link" => 1), array("unique" => true, "dropDups" => true));

    $a = $collection1->find(array())->limit(15)->skip(0);
    foreach($a as $b){
    $kod = $b["kod"];
    $link = $b["link"];

        $parc = explode(',', $link);
        $ligkoduson = $parc[0].",".$parc[1];
    $url2 = "http://www.stats.betradar.com/s4/gismo.php?&html=1&id=1424&language=tr&clientid=35&state=".$ligkoduson.",5_".$kod.",9_fixtures,231_fixtures,23_1,242_21&child=0";
        $url2 = curl($url2);
        $url2 = str_replace("\t","",$url2);
        $url2 = str_replace("\n","",$url2);
        $url2 = str_replace("\r","",$url2);

        $bul = ara("<![CDATA[", "]]>", $url2);
        $sonuc = ara("setState('", ",", $bul[0]);
        $say = count($sonuc);

        for($i = 0; $i<$say; $i++){
        $sezonbul = $sonuc[$i];

        $lonk = "http://www.stats.betradar.com/s4/gismo.php?&html=1&id=2127&language=tr&clientid=35&state=".$ligkoduson.",".$sezonbul.",9_fixtures,231_full,23_1&child=2";
        $fiksturlink = curl("http://www.stats.betradar.com/s4/gismo.php?&html=1&id=2127&language=tr&clientid=35&state=".$ligkoduson.",".$sezonbul.",9_fixtures,231_full,23_1&child=2");

        $fiksturlink = str_replace("\t","",$fiksturlink);
        $fiksturlink = str_replace("\n","",$fiksturlink);
        $fiksturlink = str_replace("\r","",$fiksturlink);

        $kategori = ara('title="', '"', $fiksturlink);
        $kategori_parcala = explode(' &gt; ', $kategori[0]);
        $tur = trim($kategori_parcala[0]);
        $ulke = trim($kategori_parcala[1]);
            $lig = $kategori_parcala[2];
            $lig_parcala = explode(' ', $lig);
            $lig_bosluk = count($lig_parcala)-1;
        $sezon = trim($lig_parcala[$lig_bosluk]);
        $lig_son = trim(str_replace($sezon, "", $lig));


            $takimlar = ara('<span class="teams">', '</a>', $fiksturlink);
            $timebul = ara('<td class="datetime">', '</td>', $fiksturlink);
            $fhbul = ara('<td class="p1 ">', '</td>', $fiksturlink);
            $ftbul = ara('<td class="nt ftx ">', '</td>', $fiksturlink);
            $dongusay = count($takimlar);
        echo $dongusay."<br>";
        for($dongu = 0; $dongu<$dongusay; $dongu++){
            $takimlarbul = ara('">', '</span>', $takimlar[$dongu]);

            $home = trim($takimlarbul[0]);
            $away = trim($takimlarbul[2]);
                $time = trim($timebul[$dongu]);
                $time_ayir = explode(' ', $time);
                $yil_ayir = explode('/', $time_ayir[0]);
                    $gun = $yil_ayir[0];
                    $ay = $yil_ayir[1];
                    $yil = $yil_ayir[2];
                $saat_ayir = explode(':', $time_ayir[1]);
                    $saat = $saat_ayir[0];
                    $dk = $saat_ayir[1];
            $time_sonuc = mktime($saat, $dk, 0, $ay, $gun, $yil);
            $fh = trim($fhbul[$dongu]);
                if(empty($fh)){
                $fh1 = null;
                $fh2 = null;
                }else{
                $fh_ayir = explode(':', $fh);
                $fh1 = $fh_ayir[0];
                $fh2 = $fh_ayir[1];
                }
            $ft = trim($ftbul[$dongu]);
            if(empty($ft)){

                $ft1 = null;
                $ft2 = null;

            }else{
                if(strpos($ft, '(')){

                    $parcala1 = explode('(', $ft);
                    $ft_ayir = explode(':', $parcala1[0]);
                    $ft1 = $ft_ayir[0];
                    $ft2 = $ft_ayir[1];

                }else{

                    $ft_ayir = explode(':', $ft);
                    $ft1 = $ft_ayir[0];
                    $ft2 = $ft_ayir[1];
                }
            }
        echo $ligkoduson."-".$sezonbul."-".$tur."-".$ulke."-".$lig_son."-".$sezon."-".$home."-".$away."-".$time_sonuc."-".$fh1."-".$fh2."-".$ft1."-".$ft2."<br>";

        $collection_maclar->insert(array(
        'ulke_kodu'=>$ligkoduson,
        'sezon_kodu'=>$sezonbul,
        'tur'=>$tur,
        'ulke'=>$ulke,
        'lig'=>$lig_son,
        'sezon'=>$sezon,
        'home'=>$home,
        'away'=>$away,
        'tarih'=>$time_sonuc,
        'fh1'=>$fh1,
        'fh2'=>$fh2,
        'ft1'=>$ft1,
        'ft2'=>$ft2
        ));
        }
        }

        }

1 个答案:

答案 0 :(得分:0)

“kod”和“link”上有唯一索引,但您插入的文档不包含这些字段名。

这意味着您插入的第一个文档将这些值设置为null,第二个文档也将...但是失败,因为它会创建您创建的唯一索引。

请注意,您使用ensureIndex()命令提供的“dropDupe”标志仅表示“删除现有重复项”,而不是“如果我再次尝试使用该密钥,则删除以前的文档”。

您当前的代码似乎是确保“lig_kod”集合上的这个索引,但我怀疑您之前(可能是偶然)使用了$ collection_maclar变量,而不是$ collection1变量并执行了代码,导致创建关于maclar集合的索引。

-Hannes