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

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







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










All Articles