2014-12-27 52 views
0

我有一個測試對象作爲一個樹上的節點,包含0個或更多的同一類型的子實例。我堅持使用MongoDB並使用Morphia查詢它。MongoDB/Morphia - 投影不能用於遞歸對象?

我執行以下查詢:

db.TestObject.find({}, { _id: 1, childrenTestObjects: 1 }).limit(6).sort({_id: 1 }).pretty(); 

導致:

{ "_id" : NumberLong(1) } 
{ "_id" : NumberLong(2) } 
{ "_id" : NumberLong(3) } 
{ "_id" : NumberLong(4) } 
{ 
     "_id" : NumberLong(5), 
     "childrenTestObjects" : [ 
       { 
         "stringValue" : "6eb887126d24e8f1cd8ad5033482c781", 
         "creationDate" : ISODate("1997-05-24T00:00:00Z") 
         "childrenTestObjects" : [ 
           { 
             "stringValue" : "2ab8f86410b4f3bdcc747699295eb5a4", 
             "creationDate" : ISODate("2024-10-10T00:00:00Z"), 
             "_id" : NumberLong(7) 
           } 
         ], 
         "_id" : NumberLong(6) 
       } 
     ] 
} 

這是真棒,但也有點令人吃驚。我有兩個問題的結果:

1)當我做一個投影,它只適用於頂部的元素。子元素仍然返回不在投影中的其他屬性(stringValue和creationDate)。我希望字段選擇適用於相同類型的所有文檔和子文檔。此樹的子項數量已減少,因此我無法在查詢中明確指定。如何做到這一點?

2)令我驚訝的是,限制適用於子文件!你會發現有一個嵌入式文檔的id爲6,我期待看到6個含N個子文檔的頂層文檔,但只有5個。如何告訴MongoDB返回6個頂層元素,而不管嵌入其中的是什麼?沒有一個一致的分​​頁系統是不可能的。

所有的幫助都讓MongoDB學得更快,我真的很感激!謝謝!

回答

1

至於1),投影在結果中保留字段。在這種情況下,該字段是childrenTestObjects恰好是一個文檔。所以mongo返回整個字段,當然這是整個子文檔。投影不是遞歸的,所以你必須明確指定每個字段。

至於2),這聽起來不對。這將有助於查看沒有添加預測的查詢結果(每個返回文檔中的完整文檔),並且我們可以從中繼續。

+0

在廣泛搜索發生了什麼之後,我意識到我的測試數據中有一個問題。所以#2不是一個有效的問題,它的行爲如預期。謝謝!! – 2015-01-01 18:14:59