Использование числовых имен полей с драйвером PHP MongoDB

Не могли бы вы сказать мне, можно ли использовать числовые имена полей в mongodb, что-то вроде этого: {"1" : 'value1', "2" : 'value2', "3" : 55}. Похоже, я могу вводить такие данные с помощью командной строки mongodb, но у меня возникают проблемы, когда я пытаюсь записать такие данные с помощью php, получая сообщение: имена полей должны быть ошибками строк.

Я узнал об именовании коллекций в mongodb здесь http://www.mongodb.org/display/DOCS/Collections, но я не нашел информацию о именовании имен полей. Спасибо.

Я пробовал это для массивов в php:

$elements[1] = 1;
$index = "2";
settype($index, "string");
$elements[$index] = 2;
$elements["3"] = 3;
var_dump($elements);

И он отображает:

array
  1 => int 1
  2 => int 2
  3 => int 3

Ошибка, о которой я говорю, это:

Произошла ошибка Ошибка приложения Информация об исключении:

Сообщение: имена полей должны быть строками Трассировка стека:

#0 C:\library\Shanty\Mongo\Collection.php(376): MongoCollection->find(Array, Array)
#1 C:\git_reps\mailable\application\models\Subscriber1.php(191): Shanty_Mongo_Collection::all(Array, Array)
#2 C:\git_reps\mailable\application\models\Subscriber1.php(203): Model_Subscriber1::getCursor(Array, Array, Array)
#3 C:\git_reps\mailable\application\controllers\ListsController.php(639): Model_Subscriber1::getPaginator(Array, Array, Array)
#4 C:\library\Zend\Controller\Action.php(513): ListsController->view1Action()
#5 C:\library\Zend\Controller\Dispatcher\Standard.php(295): Zend_Controller_Action->dispatch('view1Action')
#6 C:\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#7 C:\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#8 C:\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#9 C:\git_reps\mailable\public\index.php(25): Zend_Application->run()
#10 {main}  

Request Parameters:

array (
  'controller' => 'lists',
  'action' => 'view1',
  'module' => 'default',
  'id' => '52',
)  

Это происходит, когда я пытаюсь получить поля настройки mongodb cursuro, например «1».


person Oleg    schedule 28.02.2012    source источник


Ответы (3)


Драйвер PHP немного переусердствует, чтобы защитить вас от возврата полей, которые являются числами. К счастью, вы можете взломать его.

Итак, это не работает, потому что это проверяет конструктор MongoCursor:

$cursor = $collection->find($criteria, array("2" => 1));

Но это имеет, потому что метод fields не имеет тех же проверок, что и конструктор:

$cursor = $collection->find($criteria)->fields(array("2" => 1));

Я зарегистрировал ошибку для этого: https://jira.mongodb.org/browse/PHP- 338

(Кстати, в будущем это поможет нам в отладке, если вы предоставите больший пример кода того, что вы делаете.)

person kristina    schedule 28.02.2012
comment
Я пытаюсь использовать библиотеку Shanty, работающую с Zend Framework. Он генерирует исключение в Collection.php, используя строку: $cursor = static::getMongoCollection(false)->find($query, $fields); в методе, который пытается прочитать данные из mongodb. - person Oleg; 29.02.2012
comment
Я заменил: $cursor = static::getMongoCollection(false)->find($query, $fields); с этим в Collection.php библиотеки Shanty: $cursor = static::getMongoCollection(false)->find($query)->fields($fields); И похоже, что это работает с именами полей, состоящими только из цифр, например 1. - person Oleg; 29.02.2012
comment
Большое спасибо, Кристина. Кажется, это решает проблему. Возможно, позже эта ошибка будет исправлена ​​в php-драйвере. - person Oleg; 29.02.2012

Я предполагаю, что PHP выполняет какое-то автоматическое преобразование, когда вы используете число как строку. Попробуйте использовать settype (http://php.net/manual/en/function.settype.php), чтобы убедиться, что он задается как строка, а не преобразуется в целое число, посмотрите, позволяет ли это вам иметь то же поведение, что и оболочка MongoDB.

person Adam Comerford    schedule 28.02.2012
comment
Вот почему я не люблю PHP. Пытается быть умнее меня :) - person Sergio Tulentsev; 28.02.2012
comment
Мне довольно странно, что он конвертирует индекс 1 в 1. Честно говоря, я не сталкивался с этим и не думал об этом. - person Oleg; 28.02.2012
comment
Я отредактировал свой пост, отображающий преобразование числового индекса в строку, но похоже, что это не работает. - person Oleg; 28.02.2012

Поскольку вы храните документы json в mongodb, вы должны обратиться к http://www.json.org/ для именования технические характеристики. В определении объекта сказано, что ключи должны быть строками.

Поэтому вы должны обернуть число как строку, затем вы можете использовать его как имя атрибута.

person rompetroll    schedule 28.02.2012
comment
Могу ли я как-то использовать поле что-то вроде 2 в php и mongodb? Например, я могу сохранить документ в консоли mongodb {2: test}, но получаю какое-либо исключение в php, когда пытаюсь прочитать его из mongodb. - person Oleg; 28.02.2012
comment
Посмотрите на ответ Адама С, возможно, он что-то там понял. - person rompetroll; 28.02.2012