簡體   English   中英

MongoDB的$ lookup結果非常慢

[英]MongoDB very slow result with $lookup

我正在使用PHP與MongoDB進行交互,最近我在$lookup 5集合上使用了$lookup ,並且我的查詢開始花費大約20-25秒的時間來獲取結果。 我所有的收藏都包含不超過30-40個條目的測試數據。 我也使用了概要分析,但是卻收到消息:“查詢未記錄(太大)”

我正在共享我的PHP文件中的代碼。 我也嘗試過在字段之間創建索引,這些索引正在創建集合之間的聯接,但結果相同。 請讓我以最佳方式創建集合結構並從MongoDB檢索數據。

提前致謝。

    $collection = new MongoCollection($db, 'col_main');
    $condition = array();
    $condition[] = array(
            '$lookup' => array(
                "from" => "col_a",
                "localField" => "a",
                "foreignField" => "_id",
                "as" => "col_a"
            )
        );
    $condition[] = array(
            '$lookup' => array(
                "from" => "col_b",
                "localField" => "b",
                "foreignField" => "_id",
                "as" => "col_b"
            )
        );

    $condition[] = array(
            '$lookup' => array(
                "from" => "col_c",
                "localField" => "c",
                "foreignField" => "_id",
                "as" => "col_c"
            )
        );

    $condition[] = array(
            '$lookup' => array(
                "from" => "col_e",
                "localField" => "e",
                "foreignField" => "_id",
                "as" => "col_e"
            )
        );

    $condition[] = array(
            '$lookup' => array(
                "from" => "col_f",
                "localField" => "f",
                "foreignField" => "_id",
                "as" => "col_f"
            )
        );      

    $condition[]  = array(
            '$project' => $projection
        );

    $condition[] = array ( 
                    '$unwind' => '$col_a'

                );

    $condition[] = array (
                    '$unwind' => '$col_a.translation'

                );      

    $condition[] = array ( 
                    '$unwind' => '$col_b'

                );

    $condition[] = array (
                    '$unwind' => '$col_b.translation'

                );

    $condition[] = array ( 
                    '$unwind' => '$col_c'

                );

    $condition[] = array (
                    '$unwind' => '$col_c.translation'

                );

    $condition[] = array ( 
                    '$unwind' => '$col_e'

                );

    $condition[] = array (
                    '$unwind' => '$col_e.staff_name'

                );

    $condition[] = array (
                    '$unwind' => '$col_e.staff_surname'

                );          

    $condition[] = array ( 
                    '$unwind' => '$col_f'

                );

    $condition[] = array (
                    '$unwind' => '$col_f.translation'

                );      


    //Some More conditions

        $condition[] = array(
                    '$match' => array( 'col_b.translation.language' => $val )
                );
            $condition[] = array(
                    '$match' => array( 'col_a.translation.language' => $val )
                );
            $condition[] = array(
                    '$match' => array( 'col_c.translation.language' => $val )
                );  

            $condition[] = array(
                    '$match' => array( 'col_f.translation.language' => $val )
                );              


    return  $collection->aggregate($condition);         

當您使用許多展開操作將對象相乘時,這可能會產生大量數據集,每個$unwind muliplayes documnet集都將出現,因此可能會消耗大量內存,甚至交換內存。

如果我們有3個數組,每個數組3個元素,那么我們將對a,b,c執行展開操作,將得到:

  • 第一步后有3個文件,
  • 第二步后9份文件
  • 最后一步之后有27個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM