2012-07-25 4 views
2

을 사용하여이 쿼리를 배열로 변환하려고합니다. 그래서 PHP에서 사용할 수 있지만'index '문제가 있습니다 ... 보시다시피 , 각 '$ 또는'필드 집합을 유효성 검사 및 나는 '$ 또는'같은 모든 그들을 가입 할 수 없기 때문에 배수 '$ 또는'필요합니다. 여기

쿼리 객체입니다

{ 
'$and' : [ 
     { '$or' : [ 
      {'author' : { '$exists' : false } } 
     , {'author' : { '$in' : [ 'john' , false ] } } 
    ] } 
    , {'$or' : [ 
      { '$and' : [ { 'type' : 'post' } , { 'user_id' : 123456 } ] } 
     , { 'type' : 'comment' } 
    ] } 
    , { '$or' : [ 
      { 'tags.name' : { '$in' : [ 'tag1' , 'tag2' ] } } 
     , { 'tags' : false } 
     , { 'tags' : { '$exists' : false } } 
    ] } 
] 
} 

'$이 나'는 '작가'필드의 유효성을 확인, 그래서 현장에서 '존'으로 모든 문서를 검색하거나 거짓있어 첫 번째 세트 및 나는 '저자'필드가없는 문서를 원합니다. 두 번째 세트는 'type'필드의 유효성을 검사합니다. 'comment'값 또는 'post'가 있고 'user_id'가 123456 인 문서가 필요합니다. 세 번째 세트는 'tags'필드의 유효성을 검사합니다. '$ in'또는 'tags'= false 또는 'tags'안에 'tags.name'이 없습니다. ...

이 세 세트는 모두 맞아야합니다. 'operator ... 나는'$ and '가 2.0+에서만 작동한다는 것을 알고 있지만 2.1 (aggregation frawework testing ... 그냥 잠금 장치입니다 ... XD)

나는 그것이라고 생각합니다. 쿼리를 작성하는 또 다른 방법이 있다면 나는 reeeally보고 싶다 ... 고마워!

+0

에 쿼리입니다 {$이 존재 : 거짓}. 이것은 느려질 것입니다 * 쿼리를보다 효율적으로 재 작성하려면 스키마를 변경해야합니다. –

+0

Thx! 나는 그것을 염두에 둘 것이다! –

답변

3

여기 당신이 사용하고 있기 때문에 항상 전체 컬렉션을 스캔 할 것이 쿼리 PHP

$conn = new Mongo("localhost:$port"); 
$db = $conn->test; 
$collection = $db->tb; 

$or1 = 
    array('$or' => array(
      array('author' => array('$exists' => false)) , 
      array('author' => array('$in' => array('john', false))) 
     )); 

$or2 = 
    array('$or' => array(
     array('$and' => 
       array( 
        array('type' => 'post') , 
        array('userid' => 123456) 
        ) 
      ), 
      array('type' => 'comment') 
     )); 

$or3 = 
    array('$or' => array(
      array('tags.name' => array('$in' => array('tag1', 'tag2'))) , 
      array('tags' => false), 
      array('tags' => array('$exists' => false)) 
     )); 

$query = array('$and' => array($or1, $or2, $or3)); 


$cursor = $collection->find($query); 
foreach($cursor as $doc) { 
    // do something 
} 
+0

그 reeeealy 이해가 되네요 !! 감사!! –

관련 문제