Python, MongoDB 예제 

 

글. 수알치 오상문

 

[1] 초기 부분 

 

import time
import datetime
import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId   # 문자열 ID 값 조회 시 bjson 변환 사용
from pprint import pprint

 

# pmongo 버전 출력 (몽고DB 버전이 아님)
print(pymongo.__version__)    # 4.1.1

MongoDB 용어: 

Database > collection(table) > document(row, record)

 

 

[2] MongoDB 접속 부분

 

  1) 비인증 모드 접속 예 


conn = MongoClient(host='localhost',
                   port=27017,
                   minPoolSize=1,
                   maxPoolSize=128)

  2)  인증 모드 접속 예 : MongoDB 서버가 인증 모드로 실행된 경우
[참고] 몽고디비 서버를 인증 모드로 시작: mongod --auth

ID = 'admin'
PW = '1234'
DB = 'sample'
HOST = 'localhost'
PORT = 27017
conn = MongoClient(f'mongodb://{ID}:{PW}@{HOST}:{PORT}')

 

[3] 커넥션 확인 

if conn:
    print('MongoDB is connected.\n')
else:
    print('MongoDB connection Error')
    exit(1)
    

[4] 데이터베이스, 컬렉션 인스턴스 생성 


db = conn.sample  # conn['sample']
memo = db.memo  # db['memo']

[5] 데이터 입력 (도큐먼트/레코드)

  1) 날짜를 현재 기준으로 넣기 (로컬 시간)

저장된 자료의 id를 반환받아서 저장하고 있다. 나중에 검색에 활용할 수 있다.


post_id = memo.insert_one({
            'name': '손오공',
            'memo': '오늘도 구름 탄다.',
            'tag': ['서유기', '삼장법사', '천축국'],
            'created': datetime.datetime.now()  # 로컬 시간
            }).inserted_id

  2) 날짜를 현재 기준으로 넣기 (세계표준시, UTC)


post_id = memo.insert_one({
            'name': '감사용',
            'memo': '야구합시다',
            'tag': ['야구', 'baseball'],
            'created': datetime.datetime.utcnow()  # 세계표준시
            }).inserted_id

 

[6]  현재 디비의 컬렉션(테이블) 목록 확인 

 

print("collection:", db.list_collection_names())   # ['memo']

 

[7] memo 컬렉션의 자료(도큐먼트/레코드) 목록 출력 

 

for r in memo.find():
    pprint(r)

 

[참고] pprint() 함수는 사전/json 자료를 보기 좋게 출력한다.

 

[8] 현재 컬렉션의 도큐먼트(row) 수
print(f'현재 컬렉션의 도큐먼트(row) 수: {memo.count_documents({})}')

 

[9] 컬렉션의 첫 번째 도큐먼트 출력 

 

row = memo.find_one()  # 첫 도큐먼트 
pprint(row)

 

[10] name이 '손흥민'인 자료를 1개 찾아서 출력 

 

row = memo.find_one({'name' : '손흥민'})
pprint(row)

 

[11] _id값으로 찾기 

 

pprint(memo.fine_one({'_id': post_id})

 

post_id 값은 자료 저장 시 확인할 수 있다.

# 문자열 값 id로 조회 시 ObjectID로 변환하여 사용  
post_id = '62b6aa0ccb14d9bb5a72a51d'   <--  목록에서 확인한 값으로 검색
pprint(memo.find_one({'_id'ObjectId(post_id)}))

[12] 업데이트 

 

row 하나 업데이트 : 지정한 키만 업데이트하고 나머지 유지됨
검색 조건이나 업데이트 키가 여러 개이면 ','로 구분하여 더 넣어주자.


memo.update_one({'name': '손오공'},
    {'$set':{'memo':'오늘도 근두운을 탄다'}})

 

[13] 삭제


  1) row 하나 삭제

 

memo.delete_one({'name': '수알치'})

  2) memo 컬렉션(테이블)의 도규먼트(레코드)를 모두 삭제


try:
    memo.drop()
except Exception as e:
    print('테이블 모든 레코드 삭제 에러:', e) 

 

[14] 조건 검색 


  1) name이 허난설헌, 홍길동, 수알치인 경우


for r in memo.find({'name': {'$in': ["허난설헌", "홍길동", "수알치"]}}):
    pprint(r)

 

  2) 날짜로 검색 (시작일과 종료일 사이 조건 검색)

 

start = datetime.datetime(2022, 1, 1)
end = datetime.datetime(2022, 12, 31)

rows = memo.find({"created": {'$gte': start, '$lte': end}})

for r in rows:
    pprint(r)

 

[15] 몽고 DB 연결 해제 


conn.close()

[16] 관리자 계정 생성 (mongo.com 실행 모드에서)

 

use admin


db.createUser( { user: "develop",
           pwd: "1234",
           roles: [ "userAdminAnyDatabase",
                    "dbAdminAnyDatabase",
                    "readWriteAnyDatabase"
  ]})

 

[전체 코드]

import time
import datetime
import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId  # 문자열 ID 값 조회 시 bjson 변환 사용
from pprint import pprint
print(pymongo.__version__)  # 4.1.1
# MongoDB 용어: Database > collection(Table) > document(row, record)
'''
# MongoDB 접속 (비인증 모드)
conn = MongoClient(host='localhost',
                   port=27017,
                   minPoolSize=1,
                   maxPoolSize=128)
'''
# MongoDB 접속 (인증 모드) : MongoDB 서버가 인증 모드로 실행된 경우
# Mongo.exe 실행창에서 이용자 생성한다. 생성 명령은 가장 후반부 참조
# 몽고디비 서버를 인증 모드로 시작: mongod --auth
ID = 'admin'
PW = '1234'
DB = 'sample'
HOST = 'localhost'
PORT = 27017
conn = MongoClient(f'mongodb://{ID}:{PW}@{HOST}:{PORT}')
if conn:
    print('MongoDB is connected.\n')
else:
    print('MongoDB connection Error')
    exit(1)
db = conn.sample  # conn['sample']
memo = db.memo  # db['memo']
'''
# 날짜를 현재 기준으로 넣기 (로컬 시간)
post_id = memo.insert_one({
            'name': '손오공',
            'memo': '오늘도 구름 탄다.',
            'tag': ['서유기', '삼장법사', '천축국'],
            'created': datetime.datetime.now()  # 로컬 시간
            }).inserted_id
# 날짜를 현재 기준으로 넣기 (세계표준시, UTC)
post_id = memo.insert_one({
            'name': '감사용',
            'memo': '야구합시다',
            'tag': ['야구', 'baseball'],
            'created': datetime.datetime.utcnow()  # 세계표준시
            }).inserted_id
post_id = .inserted_id
print('POST ID:', post_id)
'''
# print("collection:", db.list_collection_names())  # ['memo']
#for r in memo.find():
#    pprint(r)
print(f'현재 컬렉션의 도큐먼트(row) 수: {memo.count_documents({})}')
print()
row = memo.find_one()  # 첫 도큐먼트 
pprint(row)
print()
row = memo.find_one({'name' : '손흥민'})
pprint(row)
print()
# pprint(memo.fine_one({'_id': post_id})
# 문자열 값 id로 조회 시 ObjectID로 변환하여 사용  
post_id = '62b6aa0ccb14d9bb5a72a51d' 
pprint(memo.find_one({'_id': ObjectId(post_id)}))
print()
# row 하나 업데이트 : 지정한 키만 업데이트하고 나머지 유지됨
# 검색 조건이나 업데이트 키가 여러 개이면 ','로 구분하여 더 넣어주자.
#memo.update_one({'name': '손오공'},
#    {'$set':{'memo':'오늘도 근두운을 탄다'}})
# row 하나 삭제
# memo.delete_one({'name': '수알치'})
# memo 컬렉션(테이블)의 도규먼트(레코드)를 모두 삭제한다
'''
try:
    memo.drop()
except Exception as e:
    print('테이블 모든 레코드 삭제 에러:', e) 
'''
# 조건 검색 (name이 허난설헌, 홍길동, 수알치인 경우)
print("조건 검색")
for r in memo.find({'name': {'$in': ["허난설헌", "홍길동", "수알치"]}}):
    pprint(r)
# 날짜 조건 검색
print('날짜 조건 검색')
start = datetime.datetime(2022, 1, 1)
end = datetime.datetime(2022, 12, 31)
rows = memo.find({"created": {'$gte': start, '$lte': end}})
for r in rows:
    pprint(r)
# 몽고 DB 연결 해제 
conn.close()
print('MongoDB is disconnected.')
반응형

+ Recent posts