У меня есть следующий массив 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/mongotestapp/inventory.php в строке 74
Что я пробовал до сих пор:
Чтобы доказать себе, что у меня есть ключи с "." в нем я использовал 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 }
Я вижу, что система генерирует законный идентификатор местоположения. Я также взял json-форматированный вывод и протестировал его в jsonlint, чтобы убедиться, что он правильно отформатирован и т. Д. Наконец, я начал играть с параметрами записи. Когда я включаю строку 78, система не возвращает никаких сообщений об ошибках, но записи не добавляются в базу данных. Но когда я устанавливаю w = 1, он не работает с тем же сообщением об ошибке.
Я играл с различными вариантами и читал это: http://php.net/manual/en/mongo.writeconcerns.php, но если у вас есть какие-то советы, у меня все уши.
У меня нет осколков или других серверов. Сейчас работает только один главный сервер mongodb.
Благодарю.
У вас не может быть .
в ваших ключевых именах, как сообщает об этом сообщение об ошибке.
MongoDB принимает это прямо, но вы не сможете запросить эти имена полей, как в запросах, точка имеет особое значение:
// document {foo:{bar:"baz"}}} // query db.col.find( { 'foo.bar' : 'baz' } );
Все официальные водители защищают от сдачи a .
(и другие символы) в именах ключей, и, следовательно, драйвер PHP правильно отвергает это.