Использование числовых имен полей с драйвером MongoDB PHP - PullRequest
2 голосов
/ 28 февраля 2012

Не могли бы вы сказать, возможно ли использовать числовые имена полей в 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".

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

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

3 голосов
/ 29 февраля 2012

Драйвер 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

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

3 голосов
/ 28 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...