Mongodb还选择了我的"其中"

时间:2012-10-05 21:56:29

标签: php 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) {

2 个答案:

答案 0 :(得分: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){
    ...
}

答案 1 :(得分:0)

除非明确排除,否则通常会将_id作为MongoDB查询的一部分返回。我不熟悉PHP语法,但看起来您可以尝试添加_id => 0