2012-07-25 54 views
2

我想這個查詢轉換成一個數組,這樣我就可以在PHP中使用,但我堅持的「索引」的問題......正如你可以看到,我需要的倍數「$或」,因爲每一個「$或」驗證一組領域,我不能加入他們都在同一個「$或」。

這裏是查詢對象:

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

第一套「$或」驗證「作者」字段,所以我在尋找任何文件與「約翰」或假的領域,我想要那些沒有「作者」字段的文檔。 第二組驗證「類型」字段,在那裏我需要有「註釋」的值或「後」和「USER_ID」文件爲123456 第三組驗證「標籤」場,在那裏我需要一些「tags.name」的「在$」內部或「標籤」 =虛假或「標籤」不存在...

這3套必須是真實的,這就是爲什麼他們都在「$和「運營商...我知道,‘$和’只能在2.0+,但我使用2.1(聚集frawework測試...它只是ROCKS!XD)

我認爲這是它...如果有另一種寫作查詢的方式,我會很樂意看到......謝謝!

+0

您查詢這個查詢將永遠做一個完整的集合掃描,因爲你正在使用{$存在:假}。這將*速度很慢*要重寫查詢以提高效率,您需要更改模式。 – 2012-07-27 17:05:13

+0

Thx!我會牢記這一點! – 2013-01-18 17:50:45

回答

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有道理!謝謝!! – 2013-01-18 17:51:22