몽고db 기본 명령어 사용법
21 Jul 2022 | backend db mongo목적
몽고디비는 nosql데이터베이스로 데이터를 json형태로 빠르게 저장하고 불러오기 위해서 사용한다.
노마드코더에서 니꼬가 SQL 과 NoSQL은 한식과 노한식이라고 생각하면 좋다고 했는데 그게 제일 쉽고 직관적인 설명인 것 같다.
기존에 가장 익숙한 DBMS(Database Management System)은 SQL과 Oracle이 있는데 둘 다 관계형 데이터베이스 RDMS(Relation Database Management System)를 지원한다. 테이블마다 pk를 이용해서 넣어져있는 데이터들의 관계적 형태를 이용해서 조인과같은 연산을 통해 원하는 데이터를 조작할 수 있다.
NoSQL(Non Relational Operation Database SQL)의 줄임말로 관계형이 아닌 데이터베이스라는 뜻이다.
일반 SQL에서는 join을 하면서 성능 저하가 있을 수 있는데 MongoDB는 json형태로 데이터를 저장하고 서로 간의 관계가 없기때문에 더 빠르게 데이터를 불러올 수 있다.
NoSQL의 장점
1) 불필요한 Join의 최소화
2) 유연성있는 서버 구조 제공
3) 비정형 데이터 구조로 설계비용 감소
4) Read/Write가 빠르며 빅데이터 처리가 가능
5) 저렴한 비용으로 분산처리 및 병렬처리 가능
4번 장점의 경우는 반드시는 아니고 일반적인 관계형 데이터베이스가 빠른 경우도 많다. 그리고 비정형 데이터로 인해 관계형 데이터베이스보다 1.5배정도 용량을 많이 차지한다.
이러한 NoSQL은 크게 4종류의 모델이 있고 대표적인 데이터베이스는 아래와 같다.
1) KEY-VALUE - Redis , Memcached
2) COLUMN - Hbase, Casandra
3) DOCUMENT - MongoDB,
4) GRAPH - GraphDB
출처: https://cionman.tistory.com/44 [Suwoni블로그:티스토리]
관계형 데이터베이스(Relational Database)와 MongoDB 논리적 구조 비교
Relational Database | MongoDB |
---|---|
Table | Collection |
Row | Document |
Column | Field |
Primary Key | Object_ID Field |
Relationship | Embbeded & Link |
기본 명령어
mongosh {ip주소} -u {아이디} -p {비밀번호}
show dbs
use user
db.stats()
show collections
db.user_active.find()
db.user_active.find({'active_dt':{$gt:'2022-04-01',$lt:'2022-04-08'}})
show dbs
use search
db.stats()
show collections
db.company.find()
db.company.find({'symbol':'018260.KS'})
db.company.find({'reg_dt':{$gt:'2022-07-01',$lt:'2022-07-22'}})
json이니까 키값이 문자열이라 따옴표를 붙여주어야한다.
예시
{
_id: ObjectId("63100d42c6df6b34c27c61d4"),
menu: 'mypage',
user_seq: 1,
reg_ts: 1661996354
},
{
_id: ObjectId("63100d44224bf614208dc6f7"),
menu: 'portfolio',
user_seq: 1,
reg_ts: 1661996356
},
{
_id: ObjectId("63100d45c6df6b34c27c61d5"),
menu: 'feed',
user_seq: 1,
reg_ts: 1661996357
}
db.menu_view.find({'menu':'portfolio', 'reg_ts' : {$gte:1664982000, $lte:1665586800}}).count()
#10월17일부터 24일까지 리스트 안의 유저가 아닌 유저들 중 메뉴가 포트폴리오인 것의 갯수
db.menu_view.find({'menu':'portfolio', 'reg_ts' : {$gte:1665932400, $lte:1666537200},'user_seq':{$nin:[72,73,385,5015,5035,7516,8919]}}).count()
파이썬에서 사용할 때
공개되지 않은 config.ini 파일에 디비 정보를 넣어놓고 끌어와서 사용한다.
#config > config.ini
[TEST_DOCUMENT_DB]
HOST = 15.123.456.78
PORT = 12345
ID = lunayyko
PASSWORD = claire1234
#config > config_doc_db.py
import os
import configparser
from config.direction import connect_doc_db
config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'config.ini')
config = configparser.ConfigParser()
config.read(config_path)
server_name = config['DEFAULT']['SERVER_NAME']
class DocumentDB:
config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'config.ini')
config = configparser.ConfigParser()
config.read(config_path)
doc_db = connect_doc_db(server_name)
doc_db_info = config[doc_db]
DOC_DB_INFO = {
"host": doc_db_info['HOST'],
"port": int(doc_db_info['PORT']),
"username": doc_db_info["ID"],
"password": doc_db_info["PASSWORD"]
}
#api 파일
from config.config_doc_db import DocumentDB as con_DocDB
def apifile(conn_mongo):
doc_db = conn_mongo.user # db이름 user
success = save_doc_db(db='community', table='board', key='board_seq', args=result, method='POST')
return True
def save_doc_db(db, table, key, args, method):
database = conn_mongo[db]
collection = database[table]
if method == 'DELETE':
collection.delete_one({"_id": args[key]})
print('doc_db 삭제 성공')
return
elif method == 'POST':
post_id = collection.insert_one(doc_dict)
print(f'doc_db {table} 저장 성공', post_id)
else:
post_id = collection.save(doc_dict)
print(f'doc_db {table} 수정 성공', post_id)
return True
if __name__ == '__main__':
conn_mongo = MongoClient(**con_DocDB.DOC_DB_INFO, **{'retryWrites': False})