2013-02-08 38 views
1

如何查詢只知道使用Doctrine MongoDB的ObjectId的對象?通過id查詢,使用$dm->findOneBy(array('id' => $id))將僅返回一個區分的文檔類型的結果,但不會返回其他結果。通過命令行查詢,例如db.documents.find({ "_id": ObjectId(...) });返回預期的行。使用Doctrine MongoDB查詢ID區分集合

編輯:這個問題似乎是,如果我不知道我正在查詢的文檔類型,並且正在使用自定義存儲庫,則使用的文檔名稱與類綁定兩個文檔類中只有一個的名稱(因此返回其他類型文檔的0結果)。這通常是有道理的,因爲如果我不知道什麼類型的文件,我正在尋找應該怎麼學說?鑑於歧視集合,是否有任何方法可以自動在存儲庫中使用正確的文檔名稱,而不必明確地告訴教條?

請參閱下面的問題抽象。

謝謝!


我有一組生活在同一文件收集,鑑別的文件被他們type領域歧視例如

{ 
    "_id" : ObjectId("510fdb6c91a4cb4c25000000"), 
    "name" : "Contract", 
    "type" : "document" 
} 
{ 
    "_id" : ObjectId("510fdb6c91a4cb4c25000001"), 
    "name" : "Tutorial", 
    "length_min": "60" 
    "type" : "video" 
} 
... 

我的兩個DocumentVideo類映射的樣子:

<!-- "Doc" Document mapping --> 
<doctrine-mongo-mapping ...> 
    <document name="Doc" collection="documents" repository-class="DocRepository"> 
    <discriminator-field fieldName="type" /> 
    <discriminator-map> 
     <discriminator-mapping value="document" class="Doc" /> 
     <discriminator-mapping value="video" class="Video" /> 
    </discriminator-map> 

    <field fieldName="id" id="true" /> 
    <field fieldName="name" field="name" type="string" /> 
    </document> 
</doctrine-mongo-mapping> 

<!-- "Video" Document mapping --> 
<doctrine-mongo-mapping ...> 
    <document name="Video" collection="documents" repository-class="DocRepository"> 
    <discriminator-field fieldName="type" /> 
    <discriminator-map> 
     <discriminator-mapping value="document" class="Doc" /> 
     <discriminator-mapping value="video" class="Video" /> 
    </discriminator-map> 

    <field fieldName="id" id="true" /> 
    <field fieldName="name" field="name" type="string" /> 
    <field fieldName="length_min" field="length_min" type="int" /> 
    </document> 
</doctrine-mongo-mapping> 

回答

1

在你的情況下,我只看到一個解決方案,而沒有訴諸創建一些像上面提到的Sean Quinn一樣的其他包裝庫。

我會爲所有被區分的文檔使用一個集合 - 如果您沒有所存儲的所有類的基類,我會添加一些抽象類。它在Doctrine documentation about inheritance mapping中描述。長話短說,您只使用一個集合,一些字段通知有關存儲對象的類,並且在查詢此存儲庫後,您將獲得一個適當類的對象。

要使用單個集合繼承映射,請將inheritance-type="SINGLE_COLLECTION"屬性添加到頂級document標記。

+0

是的,我看了一段時間後得出了幾乎相同的結論;最初我正在使用'mapped-superclass'構造,但是他們不能擁有與它們相關的定製庫,據我所知。感謝「SINGLE_COLLECTION」繼承類型的建議。 –

1

兩個解決方案,我想出了這個問題是:

  1. 要創建僅僅是不同的版本庫在實際抽象的倉庫周圍進行包裝工作。這造成了依賴注入的開銷。
  2. 使用類名限定符獲取共享存儲庫,以便查詢適當類型的對象。

這兩個解決方案仍然需要知道類名(或至少它的類型,以便可以派生出適當的類)。