2012-02-28 5 views
2

mongodb에서 숫자 필드 이름을 사용할 수 있는지 알려주십시오 : { "1": 'value1', '2': 'value2', ' 3 ": 55}. mongodb 명령 줄을 사용하여 이러한 데이터를 입력 할 수있는 것처럼 보이지만 PHP를 사용하여 이러한 데이터를 쓰려고 할 때 문제가 발생합니다. 메시지 : 필드 이름은 문자열 오류 여야합니다.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 

내가 얘기 오류입니다 :

오류가 응용 프로그램 오류 예외 발생 정보 :

나는 "1"과 같은 필드 뭔가를 설정 cursuro MongoDB를 얻을 때

#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', 
) 

그런 일이 : 메시지 : 필드 이름은 문자열을 스택 추적을해야합니다.

답변

3

PHP 드라이버는 숫자 필드를 반환하지 못하게하는 것에 대해 지나치게 과장되어 가고 있습니다. 운 좋게도 해킹 할 수 있습니다. fields 방법은 생성자와 같은 검사를하지 않기 때문에

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

그러나이 , 수행합니다 그것을위한 MongoCursor 생성자 검사가 있기 때문에

그래서,이 은하지 작업을 수행합니다 :

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

나는 이것에 대한 버그를 제기했습니다 https://jira.mongodb.org/browse/PHP-338

(Btw, 앞으로는 더 큰 코드 샘플을 제공 할 때 디버깅하는 데 도움이됩니다.)

+0

Zend Framework에서 작동하는 Shanty 라이브러리를 사용하려고합니다. $ cursor = static :: getMongoCollection (false) -> find ($ query, $ fields); in mongodb에서 데이터를 읽으려고 시도하는 메소드. – Oleg

+0

교체했습니다 : \t $ cursor = static :: getMongoCollection (false) -> find ($ query, $ fields); \t \t Shanty 라이브러리의 Collection.php에서이 파일이 하나 있습니다 : \t \t $ cursor = static :: getMongoCollection (false) -> find ($ query) -> fields ($ fields); 그리고 "1"과 같이 숫자로만 이루어진 필드 이름을 사용하는 것처럼 보입니다. – Oleg

+0

고맙습니다. 크리스티나. 그것은 문제를 해결하는 것 같습니다. 어쩌면이 버그는 나중에 php 드라이버에서 수정 될 것입니다. – Oleg

3

json 문서를 mongodb에 저장하면 이름 지정에 http://www.json.org/을 참조해야합니다. 객체의 정의는 키가 문자열이어야한다고 말합니다.

따라서 숫자를 문자열로 묶어야합니다. 그러면 숫자를 속성 이름으로 사용할 수 있습니다.

+0

PHP에서 mongodb와 같이 "2"와 같은 필드를 사용할 수 있습니까? 예를 들어, mongodb console { "2": "test"}에 문서를 저장할 수 있습니다.하지만 mongodb에서 읽으려고하면 PHP에서 예외가 발생합니다. – Oleg

+0

Adam C의 대답을 살펴보십시오. 그는 뭔가있는 것 같습니다. – rompetroll

4

내 생각에 PHP는 숫자를 문자열로 사용할 때 일종의 자동 변환을 수행합니다. settype (http://php.net/manual/en/function.settype.php)을 사용하여 문자열로 설정되고 정수로 변환되지 않았는지 확인하십시오. MongoDB 쉘과 동일한 동작을 할 수 있는지 확인하십시오.

+1

그래서 PHP가 마음에 들지 않습니다.그것은 나보다 똑똑 해지기를 원합니다. –

+0

"1"을 1 색인으로 변환한다는 것은 다소 이상합니다. 솔직하게 말해서 나는 그것에 직면하지 않고 그것에 대해 생각했습니다. – Oleg

+0

번호 색인을 문자열로 변환하는 내 게시물을 편집했지만 작동하지 않는 것처럼 보입니다. – Oleg

관련 문제