2012-02-28 3 views
2

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

Я нашел об именах коллекций в 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 

Ошибка Я говорю о том:

Ошибка Ошибка приложения Exception информация:

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

#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».

ответ

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

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

+0

Я пытаюсь использовать библиотеку Шанти, работающую с Zend Framework. Он генерирует исключение в Collection.php, используя on line: $ cursor = static :: getMongoCollection (false) -> find ($ query, $ fields); в методе, который пытается прочитать данные из mongodb. – Oleg

+0

Я заменил: \t $ cursor = static :: getMongoCollection (false) -> find ($ query, $ fields); \t \t с этим в Collection.php библиотеки Shanty: \t \t $ cursor = static :: getMongoCollection (false) -> find ($ query) -> fields ($ fields); И похоже, что он работает с именами полей, состоящими только из числа, например «1». – Oleg

+0

Большое спасибо, Кристина. Кажется, это решает проблему. Возможно, эта ошибка будет исправлена ​​в php-драйвере позже. – Oleg

3

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

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

+0

Можно ли как-то использовать поле «2» в php и mongodb? Например, я могу сохранить документ в консоли mongodb {"2": "test"} Но я получаю какое-либо исключение в php, когда пытаюсь прочитать его из mongodb. – Oleg

+0

Посмотрите на ответ Адама С, он может быть на что-то там. – rompetroll

4

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

+1

Вот почему мне не нравится PHP.Он пытается быть умнее меня :) –

+0

Мне довольно странно, что он преобразует индекс «1» в 1. Честно говоря, я не сталкивался с этим и не думал об этом. – Oleg

+0

Я отредактировал мое сообщение, отображающее индекс конвертирования чисел в строку, но похоже, что он не работает. – Oleg

Смежные вопросы