您好,登錄后才能下訂單哦!
今天給大家介紹一款分析MongoDB數據庫表結構的軟件 -- Varity.對于MongoDB這種Schema Free的數據庫來說,用軟件自帶的查詢collection中存儲的數據情況很難一眼就看出具體的數據結構,Tomá Dvoák 作者寫了一個Variety.js的腳本就很容易理解沒個collection中的數據結構。作者將工具托管在github上,并且歡迎任何人來提供建議或者添加功能。以下Variety的特點翻譯自作者的博客:
collection信息輸出格式是ASCII的。
可以很清晰看到每個key使用的是什么類型的數據格式
可以看到沒個key在這個collection的使用率是多少
可以限制documents的查詢數量
可以限制查詢documents的深度
可以只分析documents的子集
可以對查詢結果排序
可以保存查詢結果
可以以JSON格式輸出
工具簡介易用,沒用任何其他庫依賴
Variety的下載地址 https://github.com/variety/variety。
使用方法:
mongo DATABASE_NAME --eval "var collection = 'COLL_NAME' " variety.js,比如我的DATABASE_NAME 是test, COLL_NAME是users,
我事先插入的數據是
db.users.insert({name: "Tom", bio: "A nice guy.", pets: ["monkey", "fish"], someWeirdLegacyKey: "I like Ike!"}); db.users.insert({name: "Dick", bio: "I swordfight.", birthday: new Date("1974/03/14")}); db.users.insert({name: "Harry", pets: "egret", birthday: new Date("1984/03/14")}); db.users.insert({name: "Shanker", bio: "a va?"});
正常的查詢Users的回顯是這樣的
> db.users.find() { "_id" : ObjectId("56cfc28fbdae9b9a922a19cb"), "name" : "Tom", "bio" : "A nice guy", "pets" : [ "monkey", "fish" ], "someWeirdLegacyKey" : "I like ike!" } { "_id" : ObjectId("56cfc2acbdae9b9a922a19cc"), "name" : "Dick", "bio" : "I swordfight." } { "_id" : ObjectId("56cfc2c6bdae9b9a922a19cd"), "name" : "Harry", "pets" : "egret" } { "_id" : ObjectId("56cfc2e0bdae9b9a922a19ce"), "name" : "Shanker", "bio" : "caca" }
用Variety查詢結果是這樣的
mongo test --eval "var collection = 'users'" variety.js MongoDB shell version: 2.4.9 connecting to: test Variety: A MongoDB Schema Analyzer Version 1.5.0, released 14 May 2015 Using collection of "users" Using query of { } Using limit of 4 Using maxDepth of 99 Using sort of { "_id" : -1 } Using outputFormat of "ascii" Using persistResults of false Using resultsDatabase of "varietyResults" Using resultsCollection of "usersKeys" Using resultsUser of null Using resultsPass of null Using plugins of [ ] +--------------------------------------------------------------------+ | key | types | occurrences | percents | | ------------------ | -------------------- | ----------- | -------- | | _id | ObjectId | 4 | 100.0 | | name | String | 4 | 100.0 | | bio | String | 3 | 75.0 | | pets | String (1),Array (1) | 2 | 50.0 | | someWeirdLegacyKey | String | 1 | 25.0 | +--------------------------------------------------------------------+
是不是格式很友好,很容易讀懂了呢?
如果數據庫用的不是默認端口,可以用--port參數:
mongo DATABASE_NAME --port 27111 --eval " var collection = 'COLL_NAME' " variety.js
如果db文件不在默認文件,可以用--dbpath參數:
mongo DATABASE_NAME --dbpath /path/to/database/folder --eval "var collection = 'COLL_NAME' " variety.js
如果需要對查詢進行排序的話可以這樣用:
mongo DATABASE_NAME --eval "var collection = 'COLL_NAME', sort = { date : -1 }" variety.js
如果需要JSON的輸出格式的話可以這樣用:
mongo DATABASE_NAME --eval "var collection = 'users', outputFormat = 'json' " variety.js
如果一個collection有10億個數據,我們可以限制查詢的數量,用limit來限定:
mongo DATABASE_NAME --eval "var collection ='users', limit = 1000 " variety.js
如果某個colletions嵌套的層數太多了,可以用maxDepth來限制查詢:
db.users.insert({name:"Walter", someNestedObject:{a:{b:{c:{d:{e:1}}}}}});
[ibmcloud@bravo:~/variety04:05]$mongo test --eval "var collection = 'users' " variety.js MongoDB shell version: 2.4.9 connecting to: test Variety: A MongoDB Schema Analyzer Version 1.5.0, released 14 May 2015 Using collection of "users" Using query of { } Using limit of 5 Using maxDepth of 99 Using sort of { "_id" : -1 } Using outputFormat of "ascii" Using persistResults of false Using resultsDatabase of "varietyResults" Using resultsCollection of "usersKeys" Using resultsUser of null Using resultsPass of null Using plugins of [ ] +----------------------------------------------------------------------------+ | key | types | occurrences | percents | | -------------------------- | -------------------- | ----------- | -------- | | _id | ObjectId | 5 | 100.0 | | name | String | 5 | 100.0 | | bio | String | 3 | 60.0 | | pets | String (1),Array (1) | 2 | 40.0 | | someNestedObject | Object | 1 | 20.0 | | someNestedObject.a | Object | 1 | 20.0 | | someNestedObject.a.b | Object | 1 | 20.0 | | someNestedObject.a.b.c | Object | 1 | 20.0 | | someNestedObject.a.b.c.d | Object | 1 | 20.0 | | someNestedObject.a.b.c.d.e | Number | 1 | 20.0 | | someWeirdLegacyKey | String | 1 | 20.0 | +----------------------------------------------------------------------------+ [ibmcloud@bravo:~/variety05:06]$mongo test --eval "var collection = 'users', maxDepth = 3" variety.js MongoDB shell version: 2.4.9 connecting to: test Variety: A MongoDB Schema Analyzer Version 1.5.0, released 14 May 2015 Using collection of "users" Using query of { } Using limit of 5 Using maxDepth of 3 Using sort of { "_id" : -1 } Using outputFormat of "ascii" Using persistResults of false Using resultsDatabase of "varietyResults" Using resultsCollection of "usersKeys" Using resultsUser of null Using resultsPass of null Using plugins of [ ] +----------------------------------------------------------------------+ | key | types | occurrences | percents | | -------------------- | -------------------- | ----------- | -------- | | _id | ObjectId | 5 | 100.0 | | name | String | 5 | 100.0 | | bio | String | 3 | 60.0 | | pets | String (1),Array (1) | 2 | 40.0 | | someNestedObject | Object | 1 | 20.0 | | someNestedObject.a | Object | 1 | 20.0 | | someNestedObject.a.b | Object | 1 | 20.0 | | someWeirdLegacyKey | String | 1 | 20.0 | +----------------------------------------------------------------------+
如果需要制定條件的查詢,比如carddAbout為true的,可以這樣:
mongo DATABASE_NAME --eval "var collection = 'COLL_NAME', query = {'caredAbout':true}" variety.js
需要注意的是,Variety在對數據結構進行分析的時候,實際是用MapReduce來做的,會進行全表掃描操作,所以如果是對線上庫進行分析,那么建議最好使用一個不提供服務的備份庫或者在業務低峰來做。避免給線上業務造成壓力。
參考地址:
http://www.acetolyne.net/Projects7/node/48
https://github.com/variety/variety
http://www.mongoing.com/archives/2282
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。