(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【GROWI】ページに書いたテキストデータをMongoDBから確認する

スポンサーリンク

はじめに

マークダウン形式でWikipediaのようにドキュメントを生成できるGrowiは以下公式サイトにあるようにdocker-composeで利用でき

構成コンテナを見れば分かりますがMongoDBがデータベースとして利用されています。

$ docker-compose.exe ps
        Name                       Command               State            Ports
-----------------------------------------------------------------------------------------
growi_app_1             /sbin/tini -e 143 -- /dock ...   Up      127.0.0.1:3000->3000/tcp
growi_elasticsearch_1   /usr/local/bin/docker-entr ...   Up      9200/tcp, 9300/tcp
growi_mongo_1           docker-entrypoint.sh mongod      Up      27017/tcp

本記事ではGROWIで書いたデータが格納されている場所を特定して実際にMongoDB上で確認してみました。

環境情報
# mongo --version
MongoDB shell version v4.2.6

サンプル記事作成

GROWIの初回アクセス時にSignUp/SignInの画面に遷移し、最初のユーザがAdmin権限となります。

app_1            |   user {
app_1            |     isGravatarEnabled: false,
app_1            |     isEmailPublished: true,
app_1            |     lang: 'en-US',
app_1            |     status: 2,
app_1            |     admin: true,
app_1            |     _id: 5ef53e703f3d69004825c35a,
app_1            |     createdAt: xx,
app_1            |     name: 'test',
app_1            |     username: 'test',
app_1            |     email: 'testattest.com',
app_1            |     __v: 0
app_1            |   }

testユーザで以下ページを作成した場合MongoDBにはどのように見えるのでしょうか。(一度 hoge とだけ書いて保存し再度以下のようにしました)

f:id:mtiit:20200626170423p:plain
テストページ作成

MongoDB上で確認する

MongoDBコンテナにログインしてデータベースを確認すると以下の構成です。

> show dbs
admin   0.000GB
config  0.000GB
growi   0.001GB
local   0.000GB

ここでuse growiとして記事作成前後でレコードが変化しているコレクションは以下。

> show collections
...
pages
...
revisions
...

さらに記事を修正するとrevisionsのみがレコードが増えるので、「pages」で記事の情報が、「revisions」で記事の中身が管理されていることが分かります。

実際に中身を確認すれば

> db.revisions.find()

以下のようにbody部分に「# hoge\ntest」という文言が確認できます。また、一度「hoge」という本文だけで保存したことも履歴として残っています。

{ "_id" : ObjectId("5ef5a71012cc0e004785f350"), "format" : "markdown", "createdAt" : ISODate(".."), "path" : "/user/test/me
mo/../test", "body" : "hoge", "author" : ObjectId("5ef53e703f3d69004825c35a"), "__v" : 0 }
{ "_id" : ObjectId("5ef5abe012cc0e004785f353"), "format" : "markdown", "createdAt" : ISODate(".."), "path" : "/user/test/me
mo/../test", "body" : "# hoge\ntest", "author" : ObjectId("5ef53e703f3d69004825c35a"), "hasDiffToPrev" : true, "__v" : 0 }

そして、pagesを見れば以下のように記事単位で管理している情報が確認できます。

{ "_id" : ObjectId("5ef5a71012cc0e004785f34f"), "status" : "published", "grant" : 1, "grantedUsers" : [ ], "liker" : [ ], "seenUsers" : [ ObjectI
d("5ef53e703f3d69004825c35a") ], "commentCount" : 0, "extended" : "\"{}\"", "createdAt" : ISODate(".."), "updatedAt" : ISOD
ate(".."), "path" : "/user/test/memo/../test", "creator" : ObjectId("5ef53e703f3d69004825c35a"), "lastUpdateUser" :
 ObjectId("5ef53e703f3d69004825c35a"), "redirectTo" : null, "grantedGroup" : null, "__v" : 1, "revision" : ObjectId("5ef5abe012cc0e004785f353") }

終わりに

GROWIとしてのブラウザを利用せずに記載されているテキストを見たい場合に利用できます。
ちなみに、MongoDB上では「Only me (Browsing of this page is restricted)」となっているページも内容も確認できるのでデータの取り扱いにはご注意ください。

以上、GROWIの格納データの中身を見る方法でした。