2014-12-07 100 views
0

我只是在尋找最簡單的等價物,通常是兩個文件的內容相同。我不想通過eval函數比較每一個項目,因爲這暗示後:MongoDB中的 How to compare 2 mongodb collections?驗證兩個Mongodb集合是否相同

分片/複製功能必須已經內置了這樣的一個有效的方法,但我不爲了比較的目的,查看關於如何訪問此文檔的doc條目。

+0

a)這是否包含ObjectIds或只是實際的數據? b)在複製(使用Oplog)或分片(基於分片鍵的mongos路由)中,哪部分需要比較集合? – xeraa 2014-12-08 01:30:09

+0

我的具體用例是對幾個解析模塊的大量代碼更改,我想驗證它們是否會在運行數據集時生成與主分支中的模塊相同的集合。 – user3467349 2014-12-08 15:31:45

回答

7

Mongodb的分片/複製功能必須已經有一個內置的高效方法,但是我沒有看到關於如何訪問這個以用於比較的文檔條目。

複製依賴於冪等性operation log (oplog)並且不必計算集合的校驗和。 MongoDB手冊詳細介紹replication synchronization,包括初始同步和正在進行的複製行爲。

有一個內部dbHash command分片用於計算數據庫中所有集合的md5校驗和。它旨在驗證分片羣集配置數據庫中的集合的一致性,但可用於計算任何數據庫的md5總和。

注意:該dbHash命令是不明確的穩定面向客戶的API的一部分,所以他們對實現/ API是主體之間的MongoDB的版本中更改,恕不另行通知。

由於此命令遍歷所有選定數據庫中的所有收藏品的文件,你會想在大型數據庫或生產數據庫(尤其是如果您的數據集比更大的RAM)上運行時,務請審慎行事。讀取大量文檔可能導致臨時分頁出內存工作集中的有用數據/索引。

命令輸出將類似於以下內容:

> db.runCommand('dbHash') 
{ 
    "numCollections": 2, 
    "host": "nibbler.local", 
    "collections": { 
    "foo1": "adf5db735ce0ac74c35a561675614676", 
    "foo2": "adf5db735ce0ac74c35a561675614676", 
    "foo3": "26e01a5da467064790a61108170a3b5c" 
    }, 
    "md5": "f8f53a3cde773a61f5b4ccf4c3d99e07", 
    "timeMillis": 0, 
    "fromCache": [ ], 
    "ok": 1 
} 

在這個例子中foo1foo2集合具有相同的MD5和,而foo3不同。

+0

感謝您的富有洞察力的迴應。 – user3467349 2014-12-08 16:40:00