MongoDB表結(jié)構(gòu)分析工具介紹--Variety

今天給大家介紹一款分析MongoDB數(shù)據(jù)庫表結(jié)構(gòu)的軟件 -- Varity.對于MongoDB這種Schema Free的數(shù)據(jù)庫來說,用軟件自帶的查詢collection中存儲的數(shù)據(jù)情況很難一眼就看出具體的數(shù)據(jù)結(jié)構(gòu),Tomá Dvoák 作者寫了一個Variety.js的腳本就很容易理解沒個collection中的數(shù)據(jù)結(jié)構(gòu)。作者將工具托管在github上,并且歡迎任何人來提供建議或者添加功能。以下Variety的特點翻譯自作者的博客:

成都創(chuàng)新互聯(lián)長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為磴口企業(yè)提供專業(yè)的成都網(wǎng)站制作、做網(wǎng)站,磴口網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

collection信息輸出格式是ASCII的。

  • 可以很清晰看到每個key使用的是什么類型的數(shù)據(jù)格式

  • 可以看到?jīng)]個key在這個collection的使用率是多少

  • 可以限制documents的查詢數(shù)量

  • 可以限制查詢documents的深度

  • 可以只分析documents的子集

  • 可以對查詢結(jié)果排序

  • 可以保存查詢結(jié)果

  • 可以以JSON格式輸出

  • 工具簡介易用,沒用任何其他庫依賴

Variety的下載地址 https://github.com/variety/variety。

使用方法:

mongo DATABASE_NAME --eval "var collection = 'COLL_NAME' " variety.js,比如我的DATABASE_NAME 是test, COLL_NAME是users,

我事先插入的數(shù)據(jù)是

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查詢結(jié)果是這樣的

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 |
+--------------------------------------------------------------------+

是不是格式很友好,很容易讀懂了呢?

如果數(shù)據(jù)庫用的不是默認(rèn)端口,可以用--port參數(shù):

mongo DATABASE_NAME --port 27111 --eval " var collection = 'COLL_NAME' " variety.js

如果db文件不在默認(rèn)文件,可以用--dbpath參數(shù):

mongo DATABASE_NAME --dbpath /path/to/database/folder --eval "var collection = 'COLL_NAME' " variety.js

如果需要對查詢進(jìn)行排序的話可以這樣用:

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億個數(shù)據(jù),我們可以限制查詢的數(shù)量,用limit來限定:

mongo DATABASE_NAME --eval "var collection ='users', limit = 1000 " variety.js

如果某個colletions嵌套的層數(shù)太多了,可以用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在對數(shù)據(jù)結(jié)構(gòu)進(jìn)行分析的時候,實際是用MapReduce來做的,會進(jìn)行全表掃描操作,所以如果是對線上庫進(jìn)行分析,那么建議最好使用一個不提供服務(wù)的備份庫或者在業(yè)務(wù)低峰來做。避免給線上業(yè)務(wù)造成壓力。

參考地址:

http://www.acetolyne.net/Projects7/node/48

https://github.com/variety/variety

http://www.mongoing.com/archives/2282

網(wǎng)站標(biāo)題:MongoDB表結(jié)構(gòu)分析工具介紹--Variety
標(biāo)題網(wǎng)址:http://bm7419.com/article26/jcshjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站外貿(mào)建站、用戶體驗Google、品牌網(wǎng)站制作、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管