2013-06-03 4 views
0

Я использую MongoDB (версия 2.4.1) для хранения информации из файлов XML. Во время процесса синтаксического анализа XML я создаю SimpleXMLElement для каждого описания элемента. Вот код для вставки нового документа:Вставить php SimpleXMLElement в MongoDB

$response = $collection->insert($object, array('safe'=>true, 'fsync'=> true)), 

где $ object имеет тип SimpleXMLElement.

Проблема заключается в том, что мне нужно, чтобы получить идентификатор вставленной документа, но когда я пытаюсь получить его после операции вставки она возвращает NULL:

$response = $collection->insert($object, array('safe'=>true, 'fsync'=> true)), 
die(var_dump($object)); 

Это ожидаемое поведение для операции «вставить»?

+0

Как вы ожидаете, что драйвер PHP будет вставлять этот объект? Или, скорее, как вы ожидаете, что это сработает? Я бы сказал, что это очень ожидалось. – Sammaye

+0

@Sammaye На самом деле, я бы ожидал, что свойство '_id' объекта' $ object' будет установлено в новый экземпляр MongoId, но я не использовал драйвер PHP MongoDB для других, простых объектов. По какой-то причине это не должно работать, что мне не хватает? :) –

+0

, потому что это объект SimpleXMLElement? – Sammaye

ответ

1

Как вы отметили stdclass действительно работает, и водитель успешно установил поле _id на объект. Это связано с тем, что stdclass аналогичен ассоциативному массиву, и его свойства могут быть установлены публично, как и один.

SimpleXMLElement это на самом деле не является объектом, как отмечено в комментариях:

Что делает SimpleXMLElement сложно работать в том, что он чувствует и ведет себя как объект, но на самом деле система РЕСУРС, (в частности, ресурс libxml).

http://php.net/manual/en/class.simplexmlelement.php

Далее в комментарии:

Вот почему вы не можете хранить SimpleXMLElement до $ _SESSION или выполнять прямые операции сравнения на узловых значений без первой отливки их к некоторому типу объекта. $ _SESSION ожидает, что «объект» и операторы сравнения ожидают сравнения двух «объектов», а SimpleXMLElements не являются объектами.

Как бы то ни было, я считаю, что вам нужно, чтобы нарисовать SimpleXMLElement - это объект из ресурса, прежде чем он будет работать. Однако даже с этим будет сложно понять, как именно вставить объект, если он не является stdclass или что-то легко сериализуемое.

+0

Спасибо за объяснение. – Tamara

0

Вы можете создать свой собственный MongoID для поля _id в коде PHP. Когда вы создаете новый объект MongoID, он использует тот же алгоритм, который будет использоваться базой данных для генерации идентификатора, поэтому это не лучше или хуже, чем позволить mongodb генерировать его (только разница: байты 4-6 являются машинным идентификатором машины, которая запускает стек PHP, а не тот, который запускает базу данных). Но когда вы создаете _id. В PHP-коде у вас есть то преимущество, что оно известно на PHP без необходимости запрашивать базу данных для генерируемого ею значения.

+0

Я верю, что ObjectId будет сформирован на стороне клиента, даже если вы его не вводите сами, вы не ждете ответа от база данных относительно того, что было объективом – Sammaye

Смежные вопросы