変形:サービスとしての単純なデータベース

JSON Schemaを使用してJSONデータを検証し、イベントを処理し、データを処理できるデータベースを想像してください。 そして、アイデアがmongodbを使用してサービスとして実装されている場合は?


私たちはまさにそのようなサービスを開発しました。 私たちのサイドプロジェクトはそれを使用します:



カットの下に、サービスの主な機能の簡単な説明と例を示します。



この記事には次のセクションが含まれます。



ジョンソン


サービス内のすべてのエンティティはJSONドキュメントです。 このおかげで、 mongodbは私たちにとって素晴らしいものでした。


HTTP REST Api、 CLI 、およびPythonクライアントを介してドキュメントを操作できます。


CLIが好きです。


以下にその使用例をいくつか示します。



 deform document create -c venues -d '{"text":"hello world"}' 


 $ deform documents count -c my_project_users 108 

検証


すぐに言いますが、選択はJSON Schema draft v4で決まりました。 この図は、多くの有用な情報を提供します。


2つのドキュメントが届いたとしましょう。


 { "name": "  1 ", "price": 1.0, "currency": "RUB" } 

 { "name": "1$ stuff", "price": 1.99, "currency": "United States Dollar" } 

そして、2番目のドキュメントがデータベースに移動しないようにする必要があります-通貨が間違って転送されました( currencyプロパティ)。


最初のドキュメントが通過し、2番目のドキュメントが通過しないスキームを作成しましょう。


 { "description": "General goods schema", "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "number" }, "currency": { "type": "string", "enum": ["RUB", "USD", "CAD", "GBP"] } }, "required": ["name", "price", "currency"] } 

currencyとそのenumプロパティに注意してください。 通貨が「RUB」、「USD」、「CAD」、「GBP」の行と一致するドキュメントのみが正しいと見なされます。


ファイル


変形はファイル処理をサポートします。 すべてのファイルは、 _filesコレクションのドキュメントになります。 また、ファイルを添付したドキュメント自体でも、オブジェクトとして使用できます。


商品スキームに新しいプロパティを追加しましょう-商品画像です。


 { "description": "General goods schema", "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "number" }, "currency": { "type": "string", "enum": ["RUB", "USD", "CAD", "GBP"] }, "image": { "type": "file" } }, "required": ["name", "price", "currency"] } 

これで、この製品の写真をアップロードできます。


CLIを使用して、ドキュメントを作成します。


 $ deform document create -c goods -d '{ "name": "Teapot", "price": 11.99, "currency": "GBP", "image": @"/tmp/teapot.png" }' 

結果として、


 { "_id": "576ffce308888f000599ee17", "name": "Teapot", "price": 11.99, "currency": "GBP", "image": { "_id": "5772db5308888f000599f095", "collection_id": "goods", "content_type": "image/png", "date_created": "2016-06-25T18:31:12.356Z", "document_id": "576ec022bd4db46b765ae94a", "last_access": "2016-06-25T17:32:18.347Z", "md5": "a8eda376612338e0286ff1c1a725b111", "name": "teapot.png", "size": 16214 } } 

ファイルを含むコレクションと製品ドキュメント自体の両方からファイルの内容を取得できます。


ファイルを含むドキュメントセクションへのリンク


処理中


変形はデータを処理できます。 ハンドラーの完全なリスト


作成時に製品の画像のサイズを変更する必要があるとしましょう。


resizeプロセッサはこれを支援します(現時点では画像のみで動作します)


スキームは次のようになります。


 { "description": "General goods schema", "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "number" }, "currency": { "type": "string", "enum": ["RUB", "USD", "CAD", "GBP"] }, "photo": { "type": "file" }, "300x150": { "type": "file", "processors": [ { "name": "resize", "in": { "original_image": { "property": "photo" }, "size": { "value": [300,150] } } } ] } } } 

処理ドキュメントのセクションへのリンク


Webhook


私たちのウェブフックは履歴を書き、イベントを持っています。 また、ヘッダー、メソッド、および一致するドキュメントの独自の検証もあります。


製品が作成されたことをたるんで通知する必要があるとします。 フックは次のようになります。


 { "name": "Slack notification", "url": "https://hooks.slack.com/services/....", "method": "POST", "triggers": ["created"], "collection": "slack_notifications" } 

triggersプロパティに注意してください-この場合、作成されたドキュメントのみがフックをトリガーします。


ここで、価格が1000を超え、通貨がUSDである商品に関する通知のみが必要であると仮定します。


 { "name": "Slack notification", "url": "https://hooks.slack.com/services/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", "method": "POST", "triggers": ["created"], "collection": "slack_notifications", "condition": { "type": "object", "additionalProperties": true, "price": { "type": "number", "minimum": 999 }, "currency": { "type": "string", "enum": ["USD"] } } } 

ドキュメントがcondition内のスキームに対して正しい場合、フックが実行されます。


フック付きのドキュメントセクションへのリンク


おわりに


この記事は、プロジェクトの主な機能の簡単な概要です。


あなたがそれに興味を持っているなら-私は客観的な批判を含む、単なるフィードバックになります:D


プロジェクトに関するいくつかのリンク:




Source: https://habr.com/ru/post/J305156/


All Articles