在MongoDB PHP驱动程序中使用数字字段名称

时间:2012-02-28 10:03:12

标签: php mongodb mongodb-php

请告诉我是否可以在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 个答案:

答案 0 :(得分:4)

我的猜测是,当您使用数字作为字符串时,PHP正在进行某种自动转换。尝试使用settype(http://php.net/manual/en/function.settype.php)来确保它被设置为字符串而不是转换为整数,看看是否允许你具有与MongoDB shell相同的行为。

答案 1 :(得分:3)

当你在mongodb中存储json文档时,你应该参考http://www.json.org/来了解命名规范。那里的对象的定义说键必须是字符串。

因此,您必须将数字包装为String,然后您可以将其用作属性名称。

答案 2 :(得分: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

(顺便说一下,将来它可以帮助我们调试,为您提供更大的代码示例。)