如何在mongodb中连接两个表并从两个表中选择所有细节?

时间:2017-07-29 06:01:22

标签: mongodb

我有两个集合,一个是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"
                        )
                    )
                );

1 个答案:

答案 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'}}
])