Php mongodb收集来自不同集合的所有记录

Php mongodb收集来自不同集合的所有记录,php,mongodb,collections,Php,Mongodb,Collections,我正在尝试使用php从mongodb获取所有记录。 我有两个收藏。问题是,在实践中,我能为数据库中的每条记录写一句简单的句子吗 约翰[名字收藏]住在城市[城市收藏]谁 开车[从汽车收集处] 这是上面的正确编码吗?我仍然是一个新手,试图一步一步地学习 <?php foreach ($details as $doc) { echo $doc['name'] . ' lives in'; } foreach ($place as $city) { echo $city['name'] . '

我正在尝试使用php从mongodb获取所有记录。 我有两个收藏。问题是,在实践中,我能为数据库中的每条记录写一句简单的句子吗

约翰[名字收藏]住在城市[城市收藏]谁 开车[从汽车收集处]

这是上面的正确编码吗?我仍然是一个新手,试图一步一步地学习

 <?php foreach ($details as $doc) {
echo $doc['name'] . ' lives in'; } 
foreach ($place as $city) {
echo $city['name'] . ' who drives a '; }
foreach ($car as $ride) {
echo $ride['name']; 
echo '<br>'} ?>

欢迎您的想法

将for循环嵌套在彼此之间

<?php 

foreach ($details as $doc) {
 foreach ($place as $city) {
  foreach ($car as $ride) {
   echo $doc['name'] . ' lives in '.$city['name'].' who drives a '.$ride['name'].'<br/>'; 
}
 }
  }
?> 

当我试图访问多个集合中的数据以形成输出时,我就是这样做的。我希望这可以与某种类型的用户id一起使用。对这个做一个完整的表格扫描将是一个非常糟糕的主意

以下是您可以在拥有用户id的情况下执行的操作:

像那样的事情就行了


这里我假设您的用户模式中分别有一个city和ride ID,并且这两个ID字段存储一个city和ride行的ObjectId\u ID;这似乎是最符合逻辑的模式。

我认为更好的方法是使用一个集合(比如users)并为每个用户指定名称、城市和汽车。{name:'john',city:'Paris',car:'BMW'}……但与上述示例相比,它的性能如何。如果我使用了不同的集合,那么编码是否正确?如果正确填充了$details、$place、$car字段,那么PHP代码应该执行。然而,我认为这些应该放在一个集合中。如果您可以提供3个集合的样本,那么就更容易理解了。这将导致n^3次结果,这是非常糟糕的。上面的代码在某种程度上可以工作,但是正如sammaye所提到的,它检索所有x3。如何简单地提取一次结果。@user3108623 iterator_to_数组每个查询然后使用php数组进行匹配,然后再执行iterator to数组,但没有多大成功?你能告诉我你会把迭代等的代码放在哪里吗?非常感谢你以我能理解的方式编写代码。特别感谢您对代码的评论。Kind Regards其他集合上特定用户的objectid是否应相同,然后设置一次id就足够了?@user3108623如果这是关系工作的方式,那么yes还有一个问题:如果要搜索整个集合中的用户,是否可以找到足够的id?@user3108623应该可以
$users = $mongo->users->find(['_id' => ['$in' => [1,2,3,4,5,6,7,8,9]]]);

// Set some variables which will help us perform the detail queries
$cityIds = [];
$rideIds = [];
$userResults = [];
$cityResults = [];
$rideResults = [];

// Iterate through our users.
foreach($users as $_id => $user){

    // We store the MongoId for use in queries
    $cityIds[] = $user['city_id'];
    $rideIds[] = $user['ride_id'];

    // We then store the user result itself so we don't 
    // Do this query multiple times.
    $userResults[$_id] = $user;
}

// Now, let's get our first details.
$cityResults = iterator_to_array(
    $mongo->cities->find(['_id' => ['$in' => $cityIds]])
);

// And our ride details
$rideResults = iterator_to_array(
    $mongo->rides->find(['_id' => ['$in' => $rideIds]])
);

// Now let's loop and echo
foreach($userResults as $k => $user){
    echo $user['name'] . 
        ' lives in ' . 
        $cityResults[$user['city_id']]['name'] . 
        ' who drives a ' . 
        $rideResults[$user['ride_id']]['name'];
}