2017-07-29 115 views
0

我有两个集合,一个是order_master,另一个是product_master。 我需要获取只具有特定的产品名称说“顶”如何在mongodb中连接两个表并从两个表中选择所有的细节?

这里的秩序是我的我的收藏 阶法师

_id 
o_type 
product_data 
    ->0 
    ->product_id 
    ->shipping_details 

Product_master

_id 
product_name 
product_type 
基于产品的名字我

必须选择订单详情

例如:

SELECT * FROM order_master OM内部联接product_master下午pm._id = om.product_data.product_id其中pm.product_name = '顶'

类似这样

如何蒙戈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

只是我的两分钱:MongoDB是不是一个RDBMS的花哨版本。如果你试图用SQL方式建模你的数据,并使MongoDB符合它,那么你会得到两个世界中最糟糕的情况(除了副本集以外)。仔细阅读有关数据建模的文档,并重新考虑您的数据模型。如果您需要加入,那么您的用例过度标准化的可能性非常高。 –

回答

-1

是的,你可以在MongoDB的“加盟”,“表”使用聚合管道,但你真正的问题是过滤在其内部数组值的文件。在我看来,您需要首先展开product_data。这里有一些关于展开的参考https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

基本上展开将解构数组,如果订单A在product_data中有5个项目,那么展开将创建订单A的5个副本,仅在其中的5个项目之一上创建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'}} 
]) 
+0

这会不必要地重复所有的订单。 –

+0

给出了他如何模拟他的数据,但我想不出任何其他方式。 – Adit

+0

准确地说,我的观点。没有有效的用例来证明收集扫描的正确性。如果需要这样的构造来回答问题,那么数据模型本身就被搞砸了。 –