2013-06-03 44 views
0

我正在使用MongoDB(版本2.4.1)存儲XML文件中的信息。在XML解析過程中,我爲每個項目描述創建SimpleXMLElement。這裏是插入新文檔的代碼:將php SimpleXMLElement插入到MongoDB中

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

其中$ object有SimpleXMLElement類型。

的問題是,我需要插入的文檔的ID,但是當我嘗試插入操作後能得到它,它會返回NULL:

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

它是對「插入」操作的預期的行爲?

+0

您如何看待PHP驅動程序插入此對象?或者說,你如何期待它的工作?我會說這是非常期待的 – Sammaye

+0

@Sammaye其實,我期望'$ object'的'_id'屬性被設置爲一個新的'MongoId'實例,但我沒有使用PHP MongoDB驅動程序以外的其他非常簡單的物體。任何原因,它應該不工作,我錯過了? :) –

+0

,因爲它是一個'SimpleXMLElement'對象? – Sammaye

回答

1

正如您所記錄stdclass確實工作,並且驅動程序確實成功設置對象上的_id字段。這是因爲stdclass類似於關聯數組,它的屬性可以像一個一樣公開設置。

SimpleXMLElement並不是真正的對象,如在評論中指出:

是什麼讓的SimpleXMLElement棘手用的是感覺和行爲像一個對象的工作,但實際上是一個系統資源(特別是一libxml資源)。

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

而且在註釋:

這就是爲什麼你不能存儲一個SimpleXMLElement到$ _SESSION或執行上的節點值直接比較的操作,而不用先將鑄造某種類型對象。 $ _SESSION期望存儲'一個對象',並且比較操作符期望比較2個'對象',並且SimpleXMLElements不是對象。

正因爲如此,我相信你需要投的SimpleXMLElement是一個對象,從資源,它會工作之前。但是,即使如此,如果驅動程序不是stdclass或可輕鬆串行化的東西,那麼驅動程序將很難理解如何插入對象。

+0

謝謝你的解釋。 – Tamara

0

您可以爲PHP代碼中的_id字段生成您自己的MongoID。當你創建一個新的MongoID對象時,它使用數據庫將用於生成一個ID的相同算法,所以它不會比讓mongodb生成它更好或更差(只有不同​​:字節4-6是機器標識符運行PHP堆棧的機器,而不是運行數據庫的機器)。但是,當您生成_id在PHP代碼中,您可以在PHP中知道它的優點,而無需在數據庫中查詢它生成的值。

+0

我相信ObjectId將形成客戶端,即使你自己沒有輸入一個,你不等待來自數據庫關於什麼是objectid – Sammaye