[英]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執行展開操作,將得到:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.