【问题标题】:How join two table in mongodb and select all the details from both table?如何在 mongodb 中连接两个表并从两个表中选择所有详细信息?
【发布时间】:2017-07-29 06:01:21
【问题描述】:

我有两个系列,一个是 order_master,另一个是 product_master。 我只需要获取特定产品名称为“tops”的订单

这是我的收藏 订单大师

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

Product_master

_id
product_name
product_type

根据产品名称,我必须选择订单详情

例如:

Select * from order_master om inner join product_master pm on pm._id = om.product_data.product_id where 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"
                        )
                    )
                );

【问题讨论】:

  • 只是我的两分钱:MongoDB 不是 RDBMS 的花哨版本。如果您尝试以 SQL 方式对数据进行建模并使 MongoDB 符合它,那么您将得到两全其美的结果(也许除了副本集)。仔细阅读有关数据建模的文档并重新考虑您的数据模型。如果您需要加入,您为您的用例过度规范化的可能性非常高。

标签: mongodb


【解决方案1】:

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

基本上 unwind 将解构数组,如果订单 A 在 product_data 中有 5 个项目,则 unwind 将创建订单 A 的 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'}}
])

【讨论】:

  • 这将不必要地遍历所有订单。
  • 考虑到他如何建模他的数据,我想不出任何其他方式。
  • 正是我的观点。没有有效的用例来证明收集扫描的合理性。如果需要这样的结构来回答问题,那么数据模型本身就会被搞砸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2016-08-02
相关资源
最近更新 更多