2014-06-13 2 views
0

나는 PHP를 사용하여 mongodb에서 모든 레코드를 가져 오려고합니다. 두 개의 컬렉션이 있습니다. 질문은 실제로 데이터베이스의 각 레코드와 같은 간단한 문장을 만들 수 있습니까? :다른 컬렉션의 모든 레코드를 모으는 mongodb

예 : john [이름 수집에서] [도시 컬렉션에서] 누가 [자동차 컬렉션에서] 드라이브를 거주하고 있습니다.

위 코드는 올바른 코딩입니까? 나는 아직도 단계적으로 배우려고 노력 안돼서

<?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>'} ?> 

의견이 서로의 내부 루프에 대한 환영

+0

나는 더 나은 접근 방법은 사용자에게 말하기를하는 단일 컬렉션을 가지며 이름이 들어있는 모든 사용자에 대해 도시, 자동차가 있다고 생각합니다. {이름 : '존', 도시 : '파리', 자동차 : 'BMW'} .... –

+0

하지만 위의 예와 비교하면 어떻게 작동할까요? 그래도 코딩은 정확하지만 다른 컬렉션을 사용 했나요? – user3108623

+0

$ details, $ place, $ car 필드를 올바르게 채우면 PHP 코드가 실행됩니다. 그러나, 나는 이것들이 하나의 컬렉션에 있어야한다고 생각합니다. 3 가지 컬렉션의 샘플을 제공 할 수 있다면 이해하기 쉽습니다. –

답변

0

, 종류의 user_id를 형성하기 위해 여러 컬렉션의 데이터에 액세스하려고 할 때 내가 그것을 어떻게

<?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/>'; 
} 
} 
    } 
?> 

이잖아. 이것에 대한 전체 테이블 스캔을하는 것은 정말 나쁜 생각입니다. 그런

$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']; 
} 

뭔가 트릭을 할 것 : 여기

당신이 user_id이 당신이 제공 할 수있는 것입니다. 여기

나는 당신의 사용자 스키마는 각각 그 안에 cityride ID를 가지고 있다고 가정하고, 두 개의 ID 필드를 저장한다는 ObjectId (_id)는 cityride 행의; 이것은 가장 논리적 인 스키마 인 것 같습니다.

+0

코딩 할 수 있도록 고맙게 생각합니다. 특히 코드에 대한 의견에 감사드립니다. 친절한 – user3108623

+0

특정 사용자에 대한 objectid가 다른 컬렉션에서 동일하면 ID를 설정하면 충분하겠습니까? – user3108623

+0

@ user3108623 이것이 사용자 작업을위한 방법이라면 예 – Sammaye

0

둥지입니다. 메신저 나는이 말과 함께 사용 할 것으로 예상 출력

+1

그 결과는 n^3 번 뽑아 낼 것입니다 ... 끔찍한 – Sammaye

+0

하지만 분명히 작동합니다. – annoymous

+0

위의 코드는 sammaye 언급대로 작동하지만, x3은 모두 검색합니다. 어떻게 한 번만 결과를 얻을 수 있을까요? – user3108623

관련 문제