mongo PHP应用程序错误:致命错误:未捕获异常';MongoException';带有消息'&#


mongo PHP app error: Fatal error: Uncaught exception 'MongoException' with message ''.' not allowed in key

我有以下PHP数组:

array (size=9)
  'script_desc' => string 'Test Script' (length=21)
  'script_date' => string 'May 11 2016 15:40:48' (length=20)
  'log_date' => string 'May 12 2016 09:17:58' (length=20)
  'name' => string 'test name' (length=2)
  'type' => string 'location_status' (length=15)
  'status' => boolean false
  'test.server.1' => 
    array (size=1)
      'packages' => 
        array (size=2)
          'package1' => 
            array (size=4)
              'package_name' => string 'package1' (length=10)
              'current_version' => string 'package1-1.4.26-r1' (length=20)
              'latest_version' => string '1.4.26-r1' (length=9)
              'package_status' => string '=' (length=1)
          'package2' => 
            array (size=4)
              'package_name' => string 'package2' (length=14)
              'current_version' => string 'package2-0.31.1-r1' (length=24)
              'latest_version' => string '0.31.1-r2' (length=9)
              'package_status' => string '<' (length=1)
  'test.server.2' => 
    array (size=1)
      'packages' => 
        array (size=2)
          'package1' => 
            array (size=4)
              'package_name' => string 'package1' (length=16)
              'current_version' => string 'package1-0.35.1-r0' (length=26)
              'latest_version' => string '0.35.1-r0' (length=9)
              'package_status' => string '=' (length=1)
          'package3' => 
            array (size=4)
              'package_name' => string 'package3' (length=3)
              'current_version' => string 'package3-5.3.2-r0' (length=33)
              'latest_version' => string '5.3.2-r0' (length=8)
              'package_status' => string '=' (length=1)
  '_id' => float 5

以下是我用来尝试将这个数组插入我的mongo数据库的代码:

 68 function add_history_record($location)
 69 {
 70         $m = new MongoClient("mongodb://10.1.1.1:27017");
 71         $db = $m->mymongodb;
 72         $collection = $db->mycollection;
 73         $location['_id'] = getNextSequence("locationid");
 74         $cursor = $collection->insert($location);
 75 var_dump($cursor);
 76 }

我收到的错误信息是:

致命错误:未捕获异常"MongoException",消息为"不在中的密钥test.server.1'中允许/var/www/html/mongotestap/inventory.php74号线

到目前为止我尝试过的内容:

为了向自己证明我可以拥有带有"."的密钥,我使用robomongo添加了以下文档:

{
    "_id" : ObjectId("573483ae3747106e60a087f9"),
    "test.server.1.1" : 123
}

它保存了我收藏的文档,没有任何问题。我不确定我的PHP代码中缺少了什么。。。有什么建议吗?

编辑1:

我已经更改了我的代码以包括以下内容:

 68 function add_playbook_history_record($location)
 69 {
 70         $m = new MongoClient("mongodb://10.1.1.1:27017");
 71         $db = $m->phonesys;
 72         $collection = $db->inventory;
 73         $location['_id'] = getNextSequence("locationid");
 74         printf($location['_id']); 
 75         echo "<pre>".json_encode($location)."</pre>";
 76         $cursor = $collection->insert($location, array("w"=>1));
 77 
 78 //      $cursor = $collection->insert($location, array("w" => 0,"j"=>true));
 79 }

我可以看到系统正在生成一个合法的位置id。我还获取了json格式的输出,并在jsonint中进行了测试,以确保它的格式正确等等。最后,我开始玩写选项。当我启用第78行时,系统不会返回任何错误消息,但记录不会添加到数据库中。但当我设置w=1时,它失败了,并显示了关于密钥的相同错误消息
我一直在尝试不同的选择,并阅读了以下内容:http://php.net/manual/en/mongo.writeconcerns.php但如果你有什么建议的话,我洗耳恭听。

我没有任何碎片或其他服务器。现在只有一个主mongodb服务器在运行。

谢谢。

您不能像错误消息告诉您的那样在密钥名称中包含.

MongoDB直接接受这一点,但您将无法根据这些字段名称进行查询,因为在查询中,点有一个特殊的含义:

// document
{foo:{bar:"baz"}}}
// query
db.col.find( { 'foo.bar' : 'baz' } );

所有官方驱动程序都防止在密钥名称中放入.(和其他字符),因此PHP驱动程序正确地拒绝了这一点。