Я использую сервер Windows xampp с PHP 5.4 и драйвером PHP Mongo отсюда .

Я запрашиваю данные, используя:

$results = $collection->find( array('league'=>'nba') );
  foreach ($results as $user) {
      var_dump($user);
      echo "</br>";
  }

Результат:

array(5) { ["_id"]=> float(3.1677054844223E+18) ["league"]=> string(3) "nba" ["homeTeam"]=> string(10) "Washington" ...

Я конвертирую идентификатор в строку:

$cursorID = new MongoID($result['_id']);
$gameLink = "<a href='/home/game/".$cursorID."'>".$cursorID."</a>";

Который преобразует идентификатор из числа с плавающей запятой в это значение: 50fde048f1568a204c0002a1 и пытается запросить детали игры:

$gameID = new MongoID("50fde048f1568a204c0002a1"); //default
$con = new Mongo("mongodb://mongo.example.net"); // Connect to Mongo Server
$db = $con->selectDB('mydb');
$games = $db->games->find( array('_id'=>$gameID) );

Но это не дает никаких результатов.

Мысли о том, что может пойти не так?

0
esimran 22 Янв 2013 в 04:54
Что такое функция MongoID ()? это может изменить GameID (от 50fde048f1568a204c0002a1 до 3.1677054844223E + 18)?
 – 
Jefri P.
22 Янв 2013 в 05:42
Хм, ваш драйвер PHP вообще не распознает objectId по какой-то неизвестной причине. Как выглядит документ в вашей базе данных? Можете ли вы вставить вывод консоли? Ваш _id, возможно, изменил тип, в таком случае вы не можете запросить по objectid
 – 
Sammaye
22 Янв 2013 в 12:11
Вывод консоли следующий: / * 0 / {"_id": NumberLong ("3292523252251813670"), "league": "ncaab", "gameTime": "2013-01-07T18: 30: 00", " homeTeam ":" Цинциннати "," homeRank ": 14," awayTeam ":" Нотр-Дам "," awayRank ": 21} / 1 * / {" _id ": NumberLong (" 6877183749884304734 ")," league ":" ncaab "," gameTime ":" 2013-01-07T19: 00: 00 "," homeTeam ":" Penn St. "," awayTeam ":" Indiana "," awayRank ": 5}
 – 
esimran
23 Янв 2013 в 00:52

1 ответ

Лучший ответ

Да, кто-то возился с вашими ObjectId, и они больше не ObjectIds.

Вам необходимо использовать ObjectId для запроса по ним, поэтому вы не можете запросить ObjectId (MongoId в PHP).

Вы должны иметь возможность выполнять запросы, не заключая фигуру в MongoId, хотя, поскольку, если в вашем php.ini установлен native_long: http://php.net/manual/en/mongo.configuration.php#ini.mongo.native-long (что, как мне кажется, есть по умолчанию в новых драйверах), драйвер должен автоматически преобразовывать NumberLongs туда и обратно за вас.

Так что буквально просто запросите $result['_id'], не помещая его в MongoId.

Однако небольшое предостережение, используя _id, вы на самом деле не так хороши, и я бы порекомендовал вам заново заполнить все свои записи, используя ObjectId (MongoId в PHP), поскольку это будет намного эффективнее и проще, чем идентификатор, который вы используете в настоящее время.

1
Sammaye 23 Янв 2013 в 01:05
Спасибо. Мне пришлось перейти на 64-битный php env linux, чтобы он работал правильно. Также предложил команде monogo использовать objectID.
 – 
esimran
24 Янв 2013 в 03:29