1

我有这个查询

$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) {
4

2 回答 2

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){
    ...
}
于 2012-10-05T22:36:15.603 回答
0

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

于 2012-10-05T22:23:17.027 回答