MongoDB多表关联查询

本文展示了如何在MongoDB中进行多表关联查询,包括使用$lookup、$unwind等聚合操作,查询涉及到chpz_order、chpz_car_requirement、chpz_requirement_match、chpz_car及chpz_user等多个集合,主要用于订单状态筛选和计数。
<template id="chpz_order_searchOrderListByOrderState"><![CDATA[
		{
			$match: {
				requirement_type:"car",
				"$or" : [ { "from_user_id" : "${user_id}"} , { "shr_user_id" : "${user_id}"},{ "to_user_id" : "${user_id}"}],
				 #if(order_state =='order_state_create')
		 			order_state:"order_state_create",
		  		 #end
		  		 #if(order_state =='order_state_wait_transport')
		  		 	#if(user_type =='201' || user_type =='301'||user_type =='302')
		 				order_state:{$in:["order_state_wait_transport","order_state_create"]},
		  		 	#else
		  		 		order_state:"order_state_wait_transport",
		  		 	#end
		  		 #end
		  		 #if(order_state =='order_state_in_transport')
		 			order_state:"order_state_in_transport",
		  		 #end
				 #if(order_state =='order_state_finish')
		 			order_state:{$in:["order_state_received_end","order_state_already_evaluate","order_state_already_cancle"]}
		  		 #end
			}
		}
		--split--marker--
    	{
	      $sort: {
	        "create_time":-1
	      }
	    }
		--split--marker--
		{
			$skip: ${skip}
		}
		--split--marker--
		{
			$limit: ${limit}
		}
		--split--marker--
		{
			$lookup: {
			    "from" : "chpz_car_requirement",
			    "localField" : "requirement_id",
			    "foreignField" : "id",
			    "as" : "carRequirement"
			}
		}
		--split--marker--
		{
			$unwind: {
			    path : "$carRequirement",
			    preserveNullAndEmptyArrays : true
			}
		}
		--split--marker--
		{
			$lookup: {
			    "from" : "chpz_requirement_match",
			    "localField" : "requirement_match_id",
			    "foreignField" : "id",
			    "as" : "requirementMatch"
			}
		}
		--split--marker--
		{
			$unwind: {
			    path : "$requirementMatch",
			    preserveNullAndEmptyArrays : true
			}
		}
		--split--marker--
		{
			$lookup: {
			    "from" : "chpz_car",
			    "localField" : "requirementMatch.car_id",
			    "foreignField" : "id",
			    "as" : "car"
			}
		}
		--split--marker--
		{
			$unwind: {
			    path : "$car",
			    preserveNullAndEmptyArrays : true
			}
		}
		--split--marker--
		{
			$lookup: {
			    "from" : "chpz_user",
			    "localField" : "car.user_id",
			    "foreignField" : "id",
			    "as" : "user"
			}
		}
		--split--marker--
		{
			$unwind: {
			    path : "$user",
			    preserveNullAndEmptyArrays : true
			}
		}
		--split--marker--
		{
			$project: {
				"id":"$id",
				"no":"$no",
				"order_state":"$order_state",
				"platform_pay_carriage_state":"$platform_pay_carriage_state",
				"payer_pay_carriage_state":"$payer_pay_carriage_state",
				"platform_pay_goods_state":"$platform_pay_goods_state",
				"payer_pay_goods_state":"$payer_pay_goods_state",
				"platform_pay_storage_state":"$platform_pay_storage_state",
				"payer_pay_storage_state":"$payer_pay_storage_state",
				"platform_pay_carriage_money":"$platform_pay_carriage_money",
				"payer_pay_carriage_money":"$payer_pay_carriage_money",
				"platform_pay_goods_money":"$platform_pay_goods_money",
				"payer_pay_goods_money":"$payer_pay_goods_money",
				"requirement_id":"$requirement_id",
				"goods_name":"$goods_name",
				"from_lxdh":"$from_lxdh",
				"to_lxdh":"$to_lxdh",
				"requirement_type":"$requirement_type",
				"requirement_match_id":"$requirement_match_id",
				"enquiry_id":"$enquiry_id",
				"carriage_is_daishou":"$carriage_is_daishou",
				"carriage_pay_side_type":"$carriage_pay_side_type",
				"carriage_pay_time_type":"$carriage_pay_time_type",
				"carriage_pay_agreement_type":"$carriage_pay_agreement_type",
				"carriage_pay_money":"$carriage_pay_money",
				"goods_is_daishou":"$goods_is_daishou",
				"goods_pay_side_type":"$goods_pay_side_type",
				"goods_pay_time_type":"$goods_pay_time_type",
				"goods_pay_agreement_type":"$goods_pay_agreement_type",
				"goods_pay_money":"$goods_pay_money",
				"storage_is_daishou":"$storage_is_daishou",
				"storage_pay_side_type":"$storage_pay_side_type",
				"storage_pay_time_type":"$storage_pay_time_type",
				"storage_pay_agreement_type":"$storage_pay_agreement_type",
				"storage_pay_money":"$storage_pay_money",
				"llwl_record_id":"$llwl_record_id",
				"from_user_id":"$from_user_id",
				"to_user_id":"$to_user_id",
				"shr_user_id":"$shr_user_id",
				"warehouse_user_id":"$warehouse_user_id",
				"disbursement_channel":"$disbursement_channel",
				"order_cancle_side":"$order_cancle_side",
				"order_cancle_time":"$order_cancle_time",
				"liquidated_damages":"$liquidated_damages",
				"user_id":"$user_id",
				"create_time":"$create_time",
				"update_time":"$update_time",
				"driver_name":"$car.driver_name",
				"car_original_url":"$car.car_original_url",
				"car_state":"$car.car_state",
				"user_state":"$user.user_state",
				"user_image":"$user.original_image_url",
				"fhr_hw_address":"$carRequirement.fhr_hw_address",
				"shr_address":"$carRequirement.shr_address",
				"goods_type":"$carRequirement.goods_type",
				"car_type":"$carRequirement.car_type",
				"goods_total_volume":"$carRequirement.goods_total_volume",
				"goods_total_weight":"$carRequirement.goods_total_weight",
				"goods_num":"$carRequirement.goods_num",
				"yj_fh_time":"$carRequirement.yj_fh_time",
				"remark":"$carRequirement.remark",
				"requirement_no":"$carRequirement.no",
			}
		}
	]]></template>
	
	<template id="countOrderByCondition"><![CDATA[
	    {
	      $match: {
				requirement_type:"car",
				"$or" : [ { "from_user_id" : "${user_id}"} , { "shr_user_id" : "${user_id}"},{ "to_user_id" : "${user_id}"}],
				 #if(order_state =='order_state_create')
		 			order_state:"order_state_create",
		  		 #end
		  		 #if(order_state =='order_state_wait_transport')
		  		 	#if(user_type =='201' || user_type =='301'||user_type =='302')
		 				order_state:{$in:["order_state_wait_transport","order_state_create"]},
		  		 	#else
		  		 		order_state:"order_state_wait_transport",
		  		 	#end
		  		 #end
		  		 #if(order_state =='order_state_in_transport')
		 			order_state:"order_state_in_transport",
		  		 #end
				 #if(order_state =='order_state_finish')
		 			order_state:{$in:["order_state_received_end","order_state_already_evaluate","order_state_already_cancle"]}
		  		 #end
			}
		}
		--split--marker--
		{
			$lookup: {
			    "from" : "chpz_car_requirement",
			    "localField" : "requirement_id",
			    "foreignField" : "id",
			    "as" : "carRequirement"
			}
		}
		--split--marker--
		{
			$unwind: {
			    path : "$carRequirement",
			    preserveNullAndEmptyArrays : true
			}
		}
		--split--marker--
		{
			$lookup: {
			    "from" : "chpz_requirement_match",
			    "localField" : "requirement_match_id",
			    "foreignField" : "id",
			    "as" : "requirementMatch"
			}
		}
		--split--marker--
		{
			$unwind: {
			    path : "$requirementMatch",
			    preserveNullAndEmptyArrays : true
			}
		}
		--split--marker--
		{
			$lookup: {
			    "from" : "chpz_car",
			    "localField" : "requirementMatch.car_id",
			    "foreignField" : "id",
			    "as" : "car"
			}
		}
		--split--marker--
		{
			$unwind: {
			    path : "$car",
			    preserveNullAndEmptyArrays : true
			}
		}
		--split--marker--
		{
			$lookup: {
			    "from" : "chpz_user",
			    "localField" : "car.user_id",
			    "foreignField" : "id",
			    "as" : "user"
			}
		}
		--split--marker--
		{
			$unwind: {
			    path : "$user",
			    preserveNullAndEmptyArrays : true
			}
		}
		--split--marker--
		{	
			$group: {
				_id:null,
			 	totalCount:{$sum:1}
			}
		}
	]]></template>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值