php - Mongo PHP 加入来自另一个集合的数据并更新文档 - 如 SQL JOIN

标签 php mongodb

我需要有关 MongoDb 和 PHP 驱动程序的帮助。

我有 4 个集合:

  1. order_aproved :

    {
       "order_id" : mongoId ,
       "user_id":num ,
       "order_date":mongoDate ,
       "requset" : string 
    }
    
  2. 订单被拒:

    {
      "order_id" : mongoId,
      "user_id" : num ,
      "order_date" : mongoDate ,
      "requset" : string
    }
    
  3. 用户:

    {
      "user_id" : mongoId,
      "username" : num ,
      "last_order" : mongoDate ,
      "num_orders" : num,
      "last_order"
    }
    
  4. 订单日志:

    {
       "order_id" : mongoId  ,
       "order_date" : mongoDate ,
       "status" : boolen ,
       "user_id" : num
    }
    

每个批准/拒绝的订单,我都会更新用户文档中的 num_orders 有新的/被拒绝的订单。所以这个数字总是在变化 并将该订单记录在 orders_log 中。

我需要根据用户列表 [array] 获取所有在 orders_log 上批准/拒绝的订单,并获取订单数 num_orders以及该用户的订单的最后订单日期

我是这样做的:

$cursor = $orders->find()->sort(array("order_date" => -1))->limit(15);
$array = iterator_to_array($cursor,false);

$users_for_aproved = ["123","124","125"];
$users_for_rejcted = ["112","113","114"];

$js = "function() { if ( this.requset )  { return this.requset.length > 0 } }"; 

$query1 = array( '$and' => array(
    array("user_id" => array('$in'=> $users_for_aproved)),
    array('$where' => $js )
));

$query1 = array( '$and' => array(
    array("user_id" => array('$in'=> $users_for_rejcted)),
    array('$where' => $js )
));

$query_or = array('$or' => array($query,$query1);

$cursor = $orders_log->find($query_or)->sort(array("order_date" => -1))->limit(15);
$array = iterator_to_array($cursor,false);

for (  $x=0; $x < count($array) ; $x++ ) {

    $query = array( "user_id" => $order["user_id"] );
    $cursor = $orders->find($query)->limit(1);
    $array = iterator_to_array($cursor,false);

    $order_count = $array[0]["num_orders"];
    $array[$x]["order_count"] = $order_count;
}

return $array;

它正在工作,但效率不高,我需要一种方法来从另一个集合中获取数据,并将 num_orders 添加到我找到的文档中,而无需使用表单花药查询

像 SQL JOIN 但在 mongo 和 php 驱动程序上 谢谢!

最佳答案

在这种情况下,有两种方法可以提高性能:

  1. 在 MongoDB 上创建索引:
    db.order_aproved.createIndex( { user_id: 1 } )
    您可以通过上述方式创建上述索引,也可以在后台创建:
    db.order_aproved.createIndex( { user_id: 1 }, { background: true } )
    在最后一种情况下,创建会比较慢,但不会打扰当前正在进行的数据库操作。如果您负担得起,我认为您最好不要在后台创建索引,尤其是。如果不在生产数据库上运行此脚本

  2. 重新设计集合,这样您就可以在主文档中创建嵌入文档,而不是通过一些 ID 连接不同的集合,从而无需执行任何操作,类似于 RDBMS 中的 JOIN

在我看来,在您的情况下,上述最简单、更直接的解决方案是第一个。选择它,您还将避免更新嵌入式文档时的性能损失

关于php - Mongo PHP 加入来自另一个集合的数据并更新文档 - 如 SQL JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44970568/

相关文章:

php - 奇怪的 anchor 标记行为

php - 这是在两种不同类型的数组之间进行转换的最佳方法吗?

php - 连接 HTML 和 PHP 以创建图像链接

javascript - 使用 Javascript 和 Meteor 替换 MongoDb 结果中的字符串

mongodb - 如何在 mongodb 中获取已批准用户的计数

javascript - Nodejs - 如何使用express和mongoose按url中的名称进行路由?

c# - 如何通过将字典值作为过滤器参数来使用 C# 驱动程序查询 MongoDb 集合

mongodb - azure aks 将 k8 集群中运行的 mongodb 备份到本地文件或 azure 存储

PHP 路由不重定向

php - if else 错误消息总是显示 else 语句消息