2012-09-14 39 views
0

我正在開發一個系統,其中的項目可以通過訪問密鑰與其他用戶共享。我存儲訪問鍵爲shareinfo對象(嵌入式項目的文檔中)中的字段,如下圖所示:在mongodb對象中列出字段

shareinfo:{ 
    ........ 
    <nth key>: <permissions object - may be complex and large> 
    ........ 
} 

當項被訪問我檢查shareinfo.key,發現如果有效。

目前,列出我加載(在Java中)在內存中的整個shareinfo對象並運行它keySet()檢索並返回鍵而數據的其餘部分被浪費鍵。

問題出在這裏:我想獲取沒有附帶數據的鍵列表(即對象字段名稱)(因爲在某些情況下,權限對象明顯很大)。

我在這個查詢的mongodb文檔中找不到任何查詢。我想知道它是否可能?或者是否有一種優化的方式來將字段名稱列表加載到應用程序中,而不附帶字段值?

+0

恐怕不是。你可以檢查字段的存在,但是你不能得到它們的列表。 – Thilo

+0

我想最好的辦法是保持許可對象儘可能小。 btw你有什麼想法,這件事是否計劃在未來? –

回答

4

MongoDB具有無模式設計,這意味着任何文檔都可以包含任何其他文檔中包含的不同字段。要獲得所有文檔的所有字段的詳盡列表,您需要遍歷集合中的所有文檔並枚舉每個字段。對於任何尺寸合理的系列,這將是一項非常昂貴的操作。

有幾個幫手使得這個更簡單:Varietyschema.js。他們都允許你限制檢查的文件,他們也報道覆蓋範圍。兩者相當於對集合進行映射/縮減,但至少比自己寫一個簡單。

+0

任何想法如何我們可以從java驅動程序本身進行枚舉? 另外,如果我指定文檔,那麼我猜枚舉將是相當快速和高效.. –

+1

我不是最偉大的Java開發,但我已經放在一起的示例程序,讓你演示技術。它被發現在[pastie](http://pastie.org/4758169)。它基本上在「yourcollection」中找到第一條記錄,並將關鍵字段列表打印到System.out。 –

+0

謝謝!它工作得很好......我們公司已經開始研究MongoDB源代碼在後端實現這一點以及其他一些功能...... –

6

我在嘗試使用mongodb shell瞭解現有mongodb數據庫的結構時遇到了同樣的問題。然後我發現我可以使用JavaScript函數Object.keys()來檢索對象字段的數組。 (用MongoDb 2.4.2測試)

Object.keys(db.collection.findOne()) 
+0

這真的很有幫助,我很驚訝這不是很好的記錄 - 謝謝! – jayelm

+0

這只是JavaScript的基礎知識,只是看JavaScript文檔,而不是mongodb。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys順便說一下,這個查詢將顯示第一個文檔的鍵,而不是全部。 –