我有两个集合,一个是order_master,另一个是product_master。 我只需要获取那些特定产品名称为'tops'
的订单这是我的收藏 订购大师
_id
o_type
product_data
->0
->product_id
->shipping_details
Product_master
_id
product_name
product_type
根据产品名称,我必须选择订单明细
表示例如:
从order_master om内部联接product_master pm中选择*,在pm._id = om.product_data.product_id,其中pm.product_name ='top'
类似这样
如何在mongo db中编写
我试过这样的
$collection = $this->mongo_db->db->selectCollection('product_master');
$request = $collection->aggregate(
array(
'$match' => array(
'$and' => array(
array('product_name' => 'top')
)
)
),
array(
'$lookup' => array(
'from' => "order_master",
'localField' => "product_data.p_id",
'foreignField' => "_id",
'as' => "product_data"
)
)
);
答案 0 :(得分:-1)
是的,您可以使用聚合管道在mongodb中“加入”“表”,但您真正的问题是在其内部数组值上过滤文档。在我看来,你需要首先解开product_data。这里有一些关于放松的参考https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/
基本上展开将解构数组,如果订单A在product_data中有5个项目,那么展开将创建5个订单A副本,其中只有5个项目中的一个。
之后,您应用查找,然后使用查找过滤它们,并执行最后一步,即对ID进行分组以获得唯一顺序。
查询将是这样的
db.getCollection('order_master').aggregate([
{$unwind: '$product_data'},
{$lookup: {
from: 'product_master',
localField: 'product_data.product_id',
foreignField: '_id',
as: 'product_details'
}
},
{$match: {'product_details.product_name': 'tops'}},
{$group: {_id: '$_id'}}
])