2016-08-15 66 views
0

我對Mongodb比較新,我有一個想法,但不知道如何去做。Mongodb文檔格式一致性

我想要做的事實質上是散列一個mongodb文檔(最好是Json格式,因此它不是數據庫特定的),並將該散列存儲在某個引用該特定文檔的地方。這需要允許我通過查詢將來檢索文檔,並與存儲的散列進行比較。

我的想法是獲取DBObject的json表示,對其進行散列,然後在保留它之前將散列作爲字段添加到該特定文檔。然後,在查詢對象時,確保從答案中排除散列字段,以便返回的DBObject包含相同的散列。

1 - 是否MongoDB中總是返回一致DBOBJECT格式將始終轉換爲相同的JSON,這樣的散列將始終是相同的

2 - 請問這樣的實現甚至是可行的?就像在存儲與對象本身的散列一樣,本質上改變對象(因此使得散列無效),但是通過不在檢索中檢索該字段而得到解決方案

3 - 如果實現不起作用,那麼最簡單的存儲哈希的方式,另一個對象與原始文檔的引用?

回答

1

1-是否mongodb總是返回一致的DBObject格式,該格式將始終轉換爲相同的json,以便散列始終相同。 - Mongo不保證訂單,因此根據文檔上進行的更新類型,json可能會有所不同。 There is no guarantee that the field order will be consistent, or the same, after an update。如果沒有這樣的訂單更改更新,那麼訂單應該保留MongoDB update on Field Order。 但是,當你使用Jackson或其他東西將json序列化爲對象時,它將序列化爲同一個對象,並且應該具有相同的散列。

2 - 這樣的實現是否可行?就像在存儲哈希與對象本身一樣,實質上改變對象(因此使得哈希無效),而是通過不在響應中檢索該字段而得到解決。 從這個answer看起來像你可以使用Jakson或Gson散列json對象,即使它沒有排序。 excluding a field應該不成問題。 如果將散列作爲字段存儲在對象本身中,則所有保存的寫入查詢(即覆蓋整個文檔)都必須將散列寫入該查詢中。如果其中任何一個都沒有這樣做,散列將會丟失。 更新查詢將有另一個問題,因爲隨着更改數據,它還必須更新文檔的散列。所以這將不得不涉及讀取對象,修改它,計算散列並將其存回。您將無法使用原始更新查詢。

如果您將散列作爲_id字段的主鍵,可以緩解此問題,但您可能還需要其他方法。

3-最簡單的方法是將待散列文檔的_id存儲到另一個集合中,並將hash作爲新集合的_id存儲。

{ 
    "_id":<hash code of docuemnt>, 
    "refer":<_id of the document to be hashed> 
} 

這將涉及多個讀取寫入,這將影響性能,並根據您的使用情況下,它

蒙戈根據我是設計用於存儲和檢索對象一個簡單的數據庫。如果你需要做一些複雜的工作,除了快速檢索並寫出其可能不適合的任務。

+0

謝謝。欣賞輸入。我應該提到,這個想法是不會對文件進行任何更新。他們應該是不可變的,所以一些評論可能不適用。至於散列,它主要是一個例子,但我的意思是使用整個文檔作爲產生值的關鍵字(如sha-256或evem外部http調用)的某種計算,而不一定是典型的散列計算。你能否詳細說明爲什麼使用哈希作爲第二個文檔的文件而不是簡單地在該文檔中的另一個字段? – ByteFlinger

+0

我在想的是可能將文檔哈希值與其存儲值進行比較,因此需要在二級集合上查找引用會比查看哈希值更大(因爲這將是我之後的) – ByteFlinger

+0

有意義。我猜想你並沒有打算做任何更新,只是將其意見僅供參考。使hash_code成爲第二個集合的_id將意味着您可以快速查找使用其計算哈希的文檔。由於_id字段被mongo自動索引。如果它的另一個領域,你將不得不放置和索引,這將使寫入緩慢,如果你關心他們。 – Wolf7176