Flask-Dmango

Contents managements support for Flask + MongoDB applications


License
BSD-3-Clause
Install
pip install Flask-Dmango==0.0.6

Documentation

flask-dmango

์ฝ”๋”ฉ์€ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„œ๋น„์Šค๊ฐœ๋ฐœ์— ์ง‘์ค‘ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด, ๋“œ๋ง๊ณ ๋Š” ํŠน๋ณ„ํ•œ ์ฝ”๋”ฉ์ด๋‚˜ ๋…ธ๋ ฅ์—†์ด, restful-api์™€ admin๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ, ๋“œ๋ง๊ณ ๋Š” flask์™€ mongodb(flask.ext.pymongo)๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋‹จ, 0.0.3 ๋ฒ„์ „์—์„œ๋Š” admin๊ธฐ๋Šฅ์€ ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

  • install
pip install flask-dmango

1. ์†Œ๊ฐœ

restful API๋Š” ๊ณต์งœ !

์•„๋ž˜์™€ ๊ฐ™์ด mongodb์˜ ์ ‘์†์ •๋ณด๋งŒ ์ž…๋ ฅํ•ด์ฃผ๋ฉด, ์•„๋ž˜์˜ ์ฃผ์†Œ๋กœ restfulํ˜•ํƒœ์˜ api์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. http://127.0.0.1:5000/dmango/server1

from flask import Flask, current_app, Blueprint, request
from flask.ext.dmango import Dmango

app = Flask(__name__)
dmango = Dmango(app)
dmango.register_mongodb('server1', URI = 'mongodb://user_id:password@ds051459.mongolab.com:51459/database')

if __name__ == '__main__':
    app.run()

MongoDB์˜ ํŽธ๋ฆฌํ•œ ์ง€์›

register_mongodb๋กœ ๋“ฑ๋กํ•œ ๋ชฝ๊ณ ๋””๋น„๋Š” Dmango.find_mongodb() ์„ ํ†ตํ•ด blueprint๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด, ๋ชฝ๊ณ ๋””๋น„์˜ connection์„ ์‰ฝ๊ฒŒ ๋ถˆ๋Ÿฌ ์˜ฌ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from flask import Blueprint
from flask.ext.dmango import Dmango

bp = Blueprint('name1', __name__)

@bp.route('/')
def index():
    db = Dmango.find_mongodb('server1')
    result = db["collection_name"].find({"title": "์ œ๋ชฉ"})
    render_template('index.html', data=result, total=count)

ํŽธ๋ฆฌํ•œ ์ฟผ๋ฆฌ ์ƒ์„ฑ ์ง€์›

๋ณต์žกํ•œ ๋ชฝ๊ณ ๋””๋น„์˜ jsonํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ๋ฅผ ๋ช‡๊ฐ€์ง€ ๊ทœ์น™์„ ํ†ตํ•ด ๋” ์‰ฝ๊ฒŒ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ทœ์น™์€ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” restful api๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ผญ ์•Œ์•„๋‘ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค

from flask.ext.dmango import DmangoQueryBuilder

b = DmangoQueryBuilder()
b.query("title__ilike", 'apple')
b.query("price__gte:int", 5000)
b.query("code__in", ['food', 'digital'])
print b() 

==> {'price': {'$gte': 5000}, 'code': {'$in': ['food', 'digital']}, 'title': /apple/i }

2. RestFul API (๋“ค์–ด๊ฐ€๊ธฐ์ „)

๋“œ๋ง๊ณ ์˜ ResultFul API ์ฃผ์†Œํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

http://127.0.0.1:5000/dmango/server๋ช….db๋ช….collection๋ช…/๋ช…๋ น์–ด?ํ•„๋“œ๋ช…__๋ฉ”์†Œ๋“œ:ํ•„๋“œํƒ€์ž…=๊ฐ’&...

2.1 DB๋ฆฌ์ŠคํŠธ ๋ณด๊ธฐ (์˜ˆ: http://127.0.0.1:5000/dmango/server๋ช…)

์„œ๋ฒ„๋ช…๋งŒ ๋„ฃ์—ˆ์„ ๊ฒฝ์šฐ๋Š” ํ•ด๋‹น ์„œ๋ฒ„์— ์กด์žฌํ•˜๋Š” database ๋ชฉ๋ก์„ ๋˜์ ธ์ค๋‹ˆ๋‹ค.

{
            "status": 200,
            "api_name": "show_dbs",
            "db_names": [
               "cx",
               "sada9_dev",
               "local"
            ],
            "msg": "์„ฑ๊ณต",
            "total": 3,
            "server": "sada9_api"
}

2.2 collection ๋ฆฌ์ŠคํŠธ ๋ณด๊ธฐ

์˜ˆ: http://127.0.0.1:5000/dmango/server๋ช….db๋ช… ์„œ๋ฒ„๋ช…๊ณผ DB๋ช…์„ ๋„ฃ์—ˆ์„ ๊ฒฝ์šฐ๋Š” ํ•ด๋‹น ์„œ๋ฒ„์˜ DB์— ์กด์žฌํ•˜๋Š” collection ๋ชฉ๋ก์„ ๋˜์ ธ์ค๋‹ˆ๋‹ค.

{
            "status": 200,
            "api_name": "show_dbs",
            "db_names": [
               "sada9_dev",
               "local"
            ],
            "msg": "์„ฑ๊ณต",
            "total": 3,
            "server": "sada9_api"
}

2.3 ๋ช…๋ น์–ด ๋ณด๊ธฐ

์˜ˆ: http://127.0.0.1:5000/dmango/server๋ช….db๋ช….collection๋ช… ์„œ๋ฒ„๋ช…๊ณผ DB๋ช… ๊ทธ๋ฆฌ๊ณ  collection๋ช…์„ ๋ชจ๋‘ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ๋Š” ๋“œ๋ง๊ณ ์—์„œ ์ง€์›๊ฐ€๋Šฅํ•œ ๋ช…๋ น์–ด ์ •๋ณด๊ฐ€ ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค.

{
       "result": [
          {
            "name": "param", 
            "comment": "ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด ์ง€๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ", 
            "url": "./server1.sada9_dev.testdb/param"
          }, 
          {
            "name": "find_one", 
            "comment": "ํ•œ๊ฑด๋งŒ ๊ฒ€์ƒ‰ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹จ, _id ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด ๋‚˜๋จธ์ง€๋Š” ๋ฌด์‹œ๋จ", 
            "url": "./server1.sada9_dev.testdb/find_one"
          }, 
          ...  ์ƒ๋žต  ....
          {
            "name": "string_group", 
            "comment": "ํŠน์ • ํ•„๋“œ๋ฅผ ๊ทธ๋ฃนํ•‘ํ•˜์—ฌ ์นด์šดํŒ…ํ•ด์ค€๋‹ค. _group= ์ด๋ผ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.", 
            "url": "./server1.sada9_dev.testdb/string_group"
          }
       ], 
       "status": 200, 
       "api_name": "api_list", 
       "msg": "์„ฑ๊ณต", 
       "time(ms)": 0, 
       "total": 11
}

3. RestFul API (๋ช…๋ น์–ด์•Œ๊ธฐ)

๋“œ๋ง๊ณ ์˜ ResultFul API ์—์„œ "์„œ๋ฒ„.๋””๋น„.์ฝœ๋ ‰์…˜"์„ ๋ชจ๋‘ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง€์›๋˜๋Š” ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋ช…๋ น์–ด ์„ค๋ช… ์˜ˆ์ œ
param ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด ์ง€๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. .
find_one ํ•œ๊ฑด๋งŒ ๊ฒ€์ƒ‰ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹จ, _id ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด ๋‚˜๋จธ์ง€๋Š” ๋ฌด์‹œ๋œ๋‹ค ํŠน์ด ์‚ฌํ•ญ์œผ๋กœ๋Š” _page_num=1 _page_size=10 ๊ฐ™์€ ํŽ˜์ด์ง• ๊ธฐ๋Šฅ๋„ ์ ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
find ์ผ๋ฐ˜์ ์ธ ๊ฒ€์ƒ‰์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค .
count ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๊ฐ€ ๋ช‡๊ฑด์ธ์ง€ ํ™•์ธํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ .
insert ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ๋‹จ, ํ•„๋“œ๋ช…์ด _๋กœ ์‹œ์ž‘๋˜๋Š” ๊ฐ’์€ ๋ฌด์‹œ๋œ๋‹ค .
save ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. insert ์™€์˜ ์ฐจ์ด์ ์€ _id ๊ฐ€ ํ—ˆ์šฉ๋˜๋ฉฐ, ๊ฐ™์€ _id๋ฅผ ๋งŒ๋‚˜๋ฉด update ์ฒ˜๋ฆฌ๋œ๋‹ค .
update _id๋กœ 1๊ฑด์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ฐพ์•„ update ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. (์ฆ‰, where์กฐ๊ฑด์€ _id๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’์ด๋‹ค) .
remove _id ๋กœ ์ฐพ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค (์—ฌ๋Ÿฌ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š”๊ฒƒ์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค) .
push _id ๋กœ ์ฐพ์€ ๋ฐ์ดํ„ฐ์—์„œ list ํƒ€์ž…์˜ ๊ฐ’์— ๋ฐ์ดํ„ฐ๋ฅผ append ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. id=id๊ฐ’&cate_nm=์ถ”๊ฐ€ํ• ๊ฐ’
inc _id ๋กœ ์ฐพ์€ ๋ฐ์ดํ„ฐ์—์„œ ํŠน์ • ํ•„๋“œ์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค. ๋ณดํ†ต ์กฐํšŒ์ˆ˜ updateํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. /dmango/server.db.collection/inc?id=id๊ฐ’&clk_cnt=1
string_group ํ•„๋“œ๋ฅผ ๊ทธ๋ฃนํ•‘ํ•˜์—ฌ ์นด์šดํŒ…ํ•ด์ค€๋‹ค. ๊ทธ๋ฃน๋Œ€์ƒ์ด ๋˜๋Š” ํ•„๋“œ๋Š” _group ์ด๋ผ๋Š” ์˜ˆ์•ฝ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, listํƒ€์ž…์˜ ํ•„๋“œ๋ฅผ ํ’€์–ด์„œ ๊ทธํ’‰ํ•‘ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, _unwind ๋ผ๋Š” ์˜ˆ์•ฝ์–ด๊ฐ€ ์กด์žฌํ•œ๋‹ค. /dmango/server.db.collection/string_group?_group=cate_nm&_unwind=cate_nm

4. Dmango ํŒŒ๋ผ๋ฏธํ„ฐ ์•Œ๊ธฐ

๋“œ๋ง๊ณ ์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , GET ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š”๊ฒƒ์„ ์ง€์›ํ•œ๋‹ค. ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” "DmangoํŒŒ๋ผ๋ฏธํ„ฐ"์— ๋Œ€ํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

  • ๊ตฌ์กฐ : ํ•„๋“œ๋ช…__๋ฉ”์†Œ๋“œ:ํƒ€์ž…=๊ฐ’
  • ์˜ˆ์ œ : product__ilike:string=์…€์นด๋ด‰

4.1 ํ•„๋“œ๋ช…

mongodb์˜ ํ•„๋“œ๋ช…์„ ์˜๋ฏธํ•œ๋‹ค. (์Šคํ‚ค๋งˆ์˜ ํ•„๋“œ๋ช…์„ ์˜๋ฏธํ•œ๋‹ค.)

4.2 ๋ฉ”์†Œ๋“œ

๊ฒ€์ƒ‰์กฐ๊ฑด์˜ ์˜คํผ๋ ˆ์ด์…˜์„ ์˜๋ฏธํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ like๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฒ”์œ„ ๊ฒ€์ƒ‰์„ ํ•˜๊ณ  ์‹ถ์„๋•Œ ์ด์šฉํ•œ๋‹ค.

๋ฉ”์†Œ๋“œ๋ช… ์„ค๋ช…
like ์ขŒ์šฐ์ ˆ๋‹จ ๊ฒ€์ƒ‰์„ ์˜๋ฏธํ•œ๋‹ค. like ๊ฒ€์ƒ‰์„ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
ilike like์™€ ์œ ์‚ฌํ•˜๊ณ , ๋‹ค๋ฅธ์ ์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค
gt ํŠน์ •๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (val > 100)
lt ํŠน์ •๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (val < 100)
gte ํŠน์ •๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ์„ ์˜๋ฏธํ•œ๋‹ค (val >= 100)
lte ํŠน์ •๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์Œ์€ ์˜๋ฏธํ•œ๋‹ค (val <= 100)
in ๊ฐ’์ด ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ์˜๋ฏธํ•œ๋‹ค. val in (๊ฐ’1, ๊ฐ’2 ...)
nin ๊ฐ’์ด ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ์˜๋ฏธํ•œ๋‹ค. ๋‹จ N๊ฐœ์˜ ๊ฐ’์ด ์ง€์›๋œ๋‹ค. val not in (๊ฐ’1, ๊ฐ’2...)
ne not equals ( val != ๊ฐ’)
startswith ๋ฌธ์ž์—ด์ด ํŠน์ •๊ฐ’์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ์ฐพ๋Š”๋‹ค
endswith ๋ฌธ์ž์—ด์ด ํŠน์ •๊ฐ’์œผ๋กœ ๋๋‚˜๋Š”์ง€ ์ฐพ๋Š”๋‹ค
istartswith startswith์—์„œ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค
iendswith endswith์—์„œ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค
between ๋ฒ”์œ„๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. gte์™€ lte๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.
์œ ์šฉํ•œ ์ ์€ value์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ gte์™€ lte๊ฐ€ ์•Œ์•„์„œ ๋ถ™์ธ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.
price__between=200&price__between=100 ==> {price: {$lte:"200", $gte:"100"}
price__between=50&price__between=110 ==> {price: {$lte:"50", $gte:"110"}

์ƒ๋žตํ–ˆ์„๋•Œ๋Š” exact์™€ ๊ฐ™๋‹ค๊ณ  ๋ณด๋ฉด๋˜๋ฉฐ, insert, update๋ฅผ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ์•ˆ๋œ๋‹ค.

4.3 ํƒ€์ž… (๋ฐ์ดํ„ฐ ํƒ€์ž…)

๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค. int, string ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค. request๋ฐ›๋Š” ๊ฐ’์—์„œ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์•Œ์ˆ˜ ์—†๊ณ , ๋ชฝ๊ณ ๋””๋น„์—์„œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, price=100 ์œผ๋กœ ๊ฐ’์„ ๋ฐ›์œผ๋ฉด, 100์€ stringํ˜•์œผ๋กœ ๋ฐ›๊ฒŒ๋˜์–ด ์ˆซ์žํ˜• ๊ฐ’๊ณผ ๋น„๊ตํ• ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋œ๋‹ค. ์ด๋Ÿด๋•Œ, price:int=100 ๊ณผ ๊ฐ™์ด ํƒ€์ž…์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

ํ•„๋“œํƒ€์ž… ์„ค๋ช…
int ์ •์ˆ˜ํ˜• ์ˆซ์ž
long ์ •์ˆ˜ํ˜• ์ˆซ์ž
float ์†Œ์ˆซ์ ํ˜• ์ˆซ์ž
string, text, str ๋ฌธ์ž์—ด์„ ์˜๋ฏธํ•œ๋‹ค.
json json์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ํ•„๋“œ๋ช…์€ ๊ผญ "" ๋ฅผ ๋„ฃ์–ด ๊ทœ์น™์— ๋งž์ถฐ์•ผํ•œ๋‹ค.
datetime datetimeํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. yyyymmddhhmiss ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•œ ๊ฐ’์„ ๋ณ€ํ™˜ํ•œ๋‹ค.
list ์ฝค๋งˆ(,) ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด์„ list๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. (๋‚ด๋ถ€์ ์œผ๋กœ๋Š” split(",") ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด๋œ๋‹ค)
dict json๊ณผ ๋™์ผํ•˜๋‹ค
oid ObjectID ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค

4.4.๊ฐ’ ์ €์žฅ๋  ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. GETํ˜•ํƒœ์—์„œ ๋ฐ›๋Š” value์™€ ๋™์ผํ•˜๋‹ค. ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ๋Š” $today ๊ฐ€ ์กด์žฌํ•œ๋‹ค. (yyyymmdd ํ˜•ํƒœ์˜ ์˜ค๋Š˜๋‚ ์งœ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ž๋™๋ณ€ํ™˜๋œ๋‹ค.)

  1. ์˜ˆ์•ฝ์–ด ๋“œ๋ง๊ณ ์˜ ํ•„๋“œํ‘œํ˜„์—์„œ๋Š” ์˜ˆ์•ฝ์–ด๋Š” _๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ’์ด๋‹ค. ์ฃผ์†Œ find๋‚˜ string_group ๊ฐ™์€ ์กฐํšŒํ• ๋•Œ ์„ž์–ด์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • _page_num : ํŽ˜์ด์ง•์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. (string_group, find ๋ช…๋ น์—์„œ ์‚ฌ์šฉ)
  • _page_size: ํŽ˜์ด์ง•์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. (string_group, find ๋ช…๋ น์—์„œ ์‚ฌ์šฉ)
  • _start_offset : ํŽ˜์ด์ง•์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. _page_num๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด offset๊ฐ’์ด ์šฐ์„ ๋œ๋‹ค.
  • _end_offset : ํŽ˜์ด์ง•์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. _page_size๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด offset๊ฐ’์ด ์šฐ์„ ๋œ๋‹ค.
  • _fields : db์ฟผ๋ฆฌ์˜ select๋ฌธ๊ณผ ๊ฐ™๋‹ค. ์กฐํšŒํ•  ๋Œ€์ƒ์˜ ํ•„๋“œ๋ฅผ ์ œ์•ฝํ• ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. &_fields=product_nm,price ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋‹น ํ•„๋“œ์˜ ๊ฒฐ๊ณผ๋งŒ ๋ฆฌํ„ด๋œ๋‹ค.
  • _options: ๋“œ๋ง๊ณ ์˜ ์˜ต์…˜์„ ์˜๋ฏธํ•œ๋‹ค. ํ˜„์žฌ๋Š” json๊ฒฐ๊ณผ์— ๊ฐœํ–‰์„ ํ• ์ง€ ์•ˆํ• ์ง€ ์กฐ์ •ํ•˜๋Š” indent๋งŒ ์กด์žฌํ•œ๋‹ค. (์˜ˆ: _options=indent:true )
  • _group : ๊ทธ๋ฃนํ•‘ํ•  ํ•„๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. string_group ์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.
  • _unwind : ๊ทธ๋ฃนํ•‘ํ•  ์—์„œ listํƒ€์ž…์ด์–ด์„œ ์•„์ดํ…œ์„ ํ’€์–ด์•ผํ•  ํ•„๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. string_group ์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.
  • _exclude_query_fields : ์ฟผ๋ฆฌ๋กœ ์œ ๋„๋˜๋ฉด ์•ˆ๋˜๋Š” ํ•„๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊น…๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋”๋ฏธ๊ฐ’์ด ์ฟผ๋ฆฌ๋กœ ์œ ๋„๋˜์ง€ ์•Š๊ธฐ๋ฅผ ํฌ๋งํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. (์˜ˆ: _exclude_query_fields=user_id)
  • _sort : ์ •๋ ฌ์„ ํ• ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ํ•„๋“œ๋ช…__desc , ํ•„๋“œ๋ช…__asc ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค (์˜ˆ: _sort=price__desc )

6. ์˜ˆ์ œ๋กœ ๋ณด๋Š” restful API ์‚ฌ์šฉ

6.1 price ํ•„๋“œ๋Š” ์ˆซ์ž๊ฐ’์ด๊ณ  1000 ~ 2000์ธ ๊ฐ’์„ ์กฐํšŒํ•˜๊ณ ์ž ํ• ๋•Œ ==> /find?price__gte:int=1000&price__lte:int=2000

6.2 title์— "๊ตฌ๋‘"๊ฐ€ ํฌํ•จ๋œ ์ œํ’ˆ์„ ์ฐพ์•„ category๋กœ ๊ทธ๋ฃนํ•‘ ==> /string_group?title__ilike=๊ตฌ๋‘&_group=category

6.3 title์ด๋‚˜ category์— ์˜๋ฅ˜๊ฐ€ ํฌํ•จ๋œ ์ƒํ’ˆ์„ 100๊ฐœ๋งŒ ๋ณด๊ณ ์ž ํ• ๋•Œ ==> /find?title,category__ilike=์˜๋ฅ˜&_page_size=100

6.4 "6.3"์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ์ข‹๊ฒŒ ๊ฐœํ–‰ํ•ด์„œ ๋ณด๊ณ ์‹ถ์„๋•Œ ==> /find?title,category__ilike=์˜๋ฅ˜&_page_size=100&_options=indent:true

6.5 {title: "์…€์นด๋ด‰ ์‹ ํ’ˆ", price: 4500, cate_nm : ["์ƒํ™œ์šฉํ’ˆ", "ํŠน๊ฐ€"], cate_cd : [4, 6]} ์„ ์ €์žฅํ•˜๋ ค๋ฉด? ==> /insert?title=์…€์นด๋ด‰ ์‹ ํ’ˆ&price:int=4500&cate_nm:list=์ƒํ™œ์šฉํ’ˆ,ํŠน๊ฐ€&cate_cd:json=[4, 6] ==> /insert?title=์…€์นด๋ด‰ ์‹ ํ’ˆ&price:int=4500&cate_nm=์ƒํ™œ์šฉํ’ˆ&&cate_nm=ํŠน๊ฐ€&cate_cd:int=4&cate_cd:int=6 ==> ๋‹ค์–‘ํ•œ ํ‘œํ˜„์ด ๋” ์กด์žฌํ•จ.