2012-10-05 56 views
1

我有這個疑問MongoDB也選擇我「其中」

$collection->find(array('_id' => new MongoId($gameid)), array('players' => 1)); 

從這種結構

var gameSchema = new Schema({ 
    name : String, 
    map : String, 
    mode : String, 
    playerLimit : Number, 
    players : [Player], 
    isActive : Boolean 
}); 

它的工作,它選擇在選擇遊戲的所有玩家進行選擇。但由於某種原因,它也會返回_id。

Array 
(
[_id] => MongoId Object 
    (
     [$id] => 506f3c93e0b4791a86000001 
    ) 

[players] => Array 
    (
     [0] => Array 
      (
       [hero] => Neal, the demon 
       [state] => in lobby 
       [name] => Test Spiller 
      ) 

    ) 

) 

這迫使我用兩個循環,我怎樣才能使它看起來像

array(
     [0] => Array 
      (
       [hero] => Neal, the demon 
       [state] => in lobby 
       [name] => Test Spiller 
      ) 

    ) 

遍歷。

$collection = new MongoCollection($db, 'games'); 
$trav = $collection->find(array('_id' => new MongoId($gameid)), array('players' => 1)); 
foreach($trav as $player) { 
+0

我無法使用$光標[ '玩家'] @我的foreach,這意味着我必須遍歷球員第一個循環內的數組。從來沒有,這是非常正常的mongodb嗎? – MartinElvar

+0

你用什麼來循環結果?是的,當你使用'MongoCollection :: find()'時,這是預期的結果' – NullUserException

+0

@NullUserException我已經更新了這個問題。 ;) – MartinElvar

回答

1

根據我的經驗,所有驅動程序總是在選擇字段時返回_id。它也不能直接選擇一個子文檔 - 所以你需要把它抽出來。

這樣的事情應該幫助:

function array_pluck($key, $input) { 
    if (is_array($key) || !is_array($input)) return array(); 
    $array = array(); 
    foreach($input as $v) { 
     if(array_key_exists($key, $v)) $array[]=$v[$key]; 
    } 
    return $array; 
} 

,那麼你可以這樣做:

foreach(array_pluck("players",$trav) as $player){ 
    ... 
} 
+0

嗯..這對我來說似乎很愚蠢:(你的函數不能正常工作,因爲$ input將是一個MongoCursor對象,導致總是返回數組。謝謝 – MartinElvar

+0

對不起,有一段時間沒有用過php:p - 你的驅動程序在mongo shell中應該有一些等效的'.toArray()',這就是你想要在你的遊標上調用的東西檢索對象數組 – Jesse

+0

子文檔不能直接返回是不正確的 - 但這裏沒有關係,而_id:0(在shell中)會說「不返回_id。 –

0

您通常會將_id作爲MongoDB查詢的一部分返回,除非您明確排除它。我不熟悉PHP的語法,但它看起來像你可以嘗試添加_id => 0

+0

這將刪除_id,但我仍然有同樣的問題,因爲玩家仍然不是根元素。 – MartinElvar