2012-04-26 2 views
1

MongoDate로 초기화 된 서브 필드를 가진 PHP 스크립트를 사용하여 몽고 컬렉션을 생성했습니다.PHP와 MongoDate 쿼리

내가 PHP에서이 분야 맞아야 내 쿼리를 작성하고
"ts_add" : { 
    "sec" : 1335468966, 
    "usec" : 420000 
}, 

, 나는이처럼 건물입니다 :

$val = new MongoDate(strtotime($strDate)); // $strDate = '2012-04-25' 
... 
$aryQuery = array(STRING_COL_NAME => array ('$gte' => $val)); 

그리고 나는 다른 물건을 할 컬렉션의 결과 필드는 다음과 같습니다 find() 명령으로 쿼리를 실행하십시오.

는 PHP에서 빌드 쿼리 구조는 디버거에 따라, 다음과 같습니다 : 내 로그 파일에서

find(Array 
(
    [ts_add] => Array 
     (
      [$gte] => MongoDate Object 
       (
        [sec] => 1335337200 
        [usec] => 0 
       ) 

     ) 
) 

, 나는이 참조 :

runQuery called coll.table { ts_add: { $gte: new Date(1335337200000) } } 

그러나 데이터가 반환되지 않으며을 .. .. 그리고 나는 여분의 모든 0에 의해 weirded-out이다. 그러나 나는 그것이 기본 타임 스탬프 데이터가 추가되었거나 이상한 MongoDate-ism이라고 생각하고있다. ...

나는 수동으로 cli에서 다음 명령을 실행한다 :

> db.table.find({ "ts_add.sec": { $gte:1335337200 } }) 

예상대로 전체 데이터 집합이 반환됩니다.

가 MongoDate 일을 모방하려고 CLI에서 다음,이 시도 :

> var start = new Date(2012, 3, 10) 
> db.addons_add.find({ ts_add : { $gte : start } }) 

데이터가 반환되지 않습니다.

동일한 입력 데이터를 사용하여 MongoID로 변환하면 $ _id 필드를 검색하면 검색에 성공합니다.

제안 사항? 내가 뭘 놓치고 있니? 나무에서 3 인치 떨어져서 내가 숲을 보지 못한다고 불평하는 느낌이 들었습니다. ...

감사합니다!

답변

2

mongod는 모든 것을 JavaScript 형식으로 인쇄합니다.이 형식은 밀리 초 단위로 날짜를 인쇄합니다 (모든 여분의 0이 나오는 곳). 따라서 1335337200을 쿼리하면 1335337200 * 1000 = 1335337200000이됩니다.

붙여 넣은 초기 문서 조각이 잘못되었습니다. "ts_add" : {"sec" : 1335468966, "usec" : 420000}은 JSON이지만 Date 유형은 JavaScript에서 표시되지 않아야합니다. 어떻게 날짜를 저장하고 있습니까? 다른 유형의 객체로 변환 된 다음 "날짜 유형"대신 "일반 객체"로 저장되는 것 같습니다.

+0

이렇게 생각해 보니 첫 번째 데이터 구조에 대해 질문하는 것이 옳았습니다. 내 테스트 빌드에서 함수에 대한 인수없이 새로운 MongoDate() 객체로 설정하여 테스트 데이터를 구조체에 초기화했습니다. 그러나 코드의 뒷부분에서 삽입 요청이 클래스 필드 목록에 나열된 열만 추가하는지 확인하는 유효성 검사 루틴에 구조를 전달합니다. ary1에서 ary2의 후속 사본은 mongoDate()에서 mongo에 삽입되기 전에 array()로 구조체를 다시 유형 지정했습니다. 큰 도움을 주셔서 감사합니다. –