2017-11-08 1 views
2

laravel에 출력을 표시되지집계 쿼리 내 MongoDB를 데이터베이스에 수집을 다음 한

clat_output

내가 의 조건이 시간clat_output를 검색 할
{ 
"_id" : ObjectId("59fc6492421aa91e3e71d753"), 
"output" : [ 
    { 
     "time" : "100", 
     "clat" : "127" 
    }, 
    { 
     "time" : "254", 
     "clat" : "294" 
    }, 
    { 
     "time" : "354", 
     "clat" : "437" 
    } 
    ... 
    ... 
] 
} 

clat_output는 주어진 범위 사이에 있어야합니다. 예를

나는 그래서
{ 
"_id" : ObjectId("59fc6492421aa91e3e71d753"), 
"output" : [ 
    { 
     "time" : "100", 
     "clat" : "127" 
    }, 
    { 
     "time" : "254", 
     "clat" : "294" 
    } 
] 
} 

나는 다음과 같은 쿼리를 실행 출력

다음 주어야한다 300

1로 주어진 시간 간격으로 _id = ObjectId("59fc6492421aa91e3e71d753")을 가진 clat_output을 인출 할

를 들어

mongodb 콘솔에서 원하는 결과를 얻습니다. 내가 laravel에서 원시 쿼리로 같은 집계 쿼리를 변환 할 때

db.clat_output.aggregate({ 
    '$match' : {"_id" : ObjectId("59fc6492421aa91e3e71d753")}}, { 
    '$addFields' : { 
     'output' : { 
     '$filter' : { 
      'input' : '$output', 
      'as' : 'result', 
      'cond' : { 
       '$and' : [ 
        {'$gte' : ['$$result.time', '1']}, 
        {'$lte' : ['$$result.time', '300']} 
       ] 
      } 
     } 
    } 
    } 
}); 

는하지만, 그것은 output로 빈 배열을 보여주는 것. 다음은 laravel의 내 검색어입니다.

public function clat_output($id, $start, $end) { 
    $query = [ 
    ['$match' => ["_id" => $id]], [ 
     '$addFields' => [ 
      'output' => [ 
      '$filter' => ['input' => '$output', 'as' => 'result', 
       'cond' => [ 
        '$and' => [ 
         ['$gte' => ['$$result.time', $start]], 
         ['$lte' => ['$$result.time', $end]] 
        ] 
       ] 
      ] 
      ] 
     ] 
    ] 
    ]; 

    $result = self::raw(function ($collection) { 
    return $collection->aggregate($query); 
    }); 
    return $result; 
} 
+0

직접 관련이 없더라도 데이터에 결함이 있습니다. ''time ''을 문자열로 사용하고''5 '는'1 '과'300 '의 값 사이에'5 '로 시작하지 않으므로'5 ' ''와 범위 내에없는 '문자열'로 표시됩니다. "숫자 범위"를 쿼리하려는 경우 실제로 "숫자"값을 원합니다. 그래서 당신은 정말로 데이터를 변환해야합니다. –

+0

감사합니다. @ NeilLunn. – Sadhu

답변

2

귀하의 질의가 완벽하다고 보입니다. 내가 약간 회의적 인 유일한 점은 $start$end의 형식 불일치에 관한 것입니다. 유효성을 검사하려면 mongo 콘솔에서 다음 코드를 사용할 수 있습니다. 명령

echo gettype($start),"\n"; 
echo gettype($end); 

다음 형식 변환을 할 필요가 데이터 유형이 일치하지 않으면 다음과 같은 사용하여 $start$end의 PHP를 검사 데이터 형식에

function printSchema(obj) { 
    for(var key in obj) { 
    if(key === 'output') { 
     print('time',typeof obj[key][0]['time']); 
     break; 
    } 
    } 
} 
var obj = db.clat_output.findOne(); 
printSchema(obj); 

.

+0

예 유형이 일치하지 않습니다. 시간 필드는 데이터베이스에 문자열로 저장되었고 PHP에서 정수와 비교했습니다. – Sadhu