gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:40:28 25 4
gpt4 key购买 nike

我需要有关 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com