DB/mongoDB

python mongoDB(몽고DB)기초 - 접속, 생성, 검색, 삭제 (insert, find, update)

개발자J군 2020. 6. 16. 21:29

 

 

파이썬에서 몽고db를 사용하기 위해서는 라이브러리 설치가 필요합니다.

pip install pymongo

 

라이브러리 설치가 완료되었으면 간단한 형태의 딕셔너리형 자료를 추가해봅니다.

참고로 몽고db에 인서트 시키는 자료는 dict 형 이어야 합니다. (리스트 안의 dict는 가능)

 

삽입(insert)

import pymongo

#접속된 객체를 conn으로 받는다
conn = pymongo.MongoClient("localhost", 27017)

#test 데이터베이스가 없으면 자동으로 생성됩니다.
db = conn.test

#컬렉션은 테이블같은 개념. sql에서는 table , mongodb는 컬렉션.
#members 컬렉션 없을 경우 생성됨.
col = db.members


people = {
    "이름" : "홍길동",
    "나이" :30,
    "별명" : "의적"
    }
    
# 정보 삽입 (반복해서 수행할 경우 같은 정보가 계속 인서트 됩니다.)
col.insert(people)

위의 과정을 수행하면 people 정보가 삽입됩니다. 고유한 id값은 몽고db에서 자동적으로 생성됩니다.

 

 

검색(find)

#전체검색
result = col.find()
for r in result:
    print(r)
    

#특정조건검색 / 이름이 홍길동인 것을 모두 가져옴
result = col.find({"이름":"홍길동"})
for r in result:
	print(r)
    

#특정조건검색 / 이름이 홍길동이면서 나이가 30인 결과를 모두 가져옴 (and)
result = col.find({"이름":"홍길동","나이":30})
for r in result:
    print(r)
    

#특정조건검색 / 이름이 홍길동이거나 나이가 30이거나 결과를 모두 가져옴 (or)
result = col.find({"$or" : [ {"이름":"홍길동"} , {"나이":30} ] } )
for r in result:
    print(r)


#결과의 맨 위의 값 하나만 가져옴
result = col.find_one({"이름":"홍길동"})
print(result)


# 나이가 40보다 큰 사람을 찾음
result = col.find({"나이": {"$gt" : 40} })   #$gte = 크거나 같거나 (40도 포함됨)
for r in result :
    print(r)
    
#나이가 40보다 크고 50보다 작은 경우
result = col.find({"나이": {"$gt" : 40, "$lt": 50} })   #$lte = 작거나 같거나 (50도 포함됨)
for r in result :
    print(r)
    

#나이가 40보다 크고 50보다 작은 데이터의 나이만 보고 싶을때
result = col.find({"나이": {"$gt" : 40, "$lte": 50}},{"나이":True})
for r in result:
    print(r)
    
    
#나이가 40보다 크고 50보다 작거나 같은 데이터의 나이만 보고 싶을때 /단 id는 미출력
result = col.find({"나이": {"$gt" : 40, "$lte": 50}},{"_id":False, "나이":True})
for r in result:
    print(r)


#limit(4) 결과를 4개만 보겠다.
result = col.find().limit(4)
for r in result:
    print(r)
    

#skip(1) 첫 1개의 데이터는 보지 않는다.
result = col.find().skip(1).limit(4)
for r in result:
    print(r)

 

 

업데이트(update)

#아래와 같은 쿼리는 이름이 바뀌나 나이, 별명 등의 정보는 사라지기때문에 주의해야함.
col.update({"이름":"홍길동"}, {"이름":"유길동"})


# 홍길동을 찾아 주길동으로 바꿔라. 맨 위에 있는 데이터만 수정됨.
col.update({"이름":"홍길동"}, {"$set":{"이름" :"주길동"}})


# 모든 홍길동의 성적을 A라 바꿔라.
col.updateMany({"이름" :"홍길동"},{$set : {"성적":"A"}})

업데이트시 주의사항은 위의 경우에서 보면

$set을 붙이지 않을 경우 이름이 바뀌면서 다른 정보(나이, 별명)는 사라지게 됩니다. 따라서 이름만 바꾸고 싶을 경우에는 아래와 같이 작성해야 합니다.

col.update({"이름":"홍길동"}, {"$set":{"이름" :"주길동"}})

 

업서트(upsert)

#이름 정길동을 찾아 별명을 의적으로 수정해라. 단 정길동이 없으면 생성 (upsert = update+insert)
col.update({"이름":"정길동"}, {"$set":{"별명" :"의적"}},upsert =True, multi = True)

upsert 는 해당 정보를 찾아 업데이트를 하게되는데 만약 "정길동" 이 없다면 새롭게 생성됩니다.

여기서 별명또한 함께 생성됩니다.  ({"이름":"정길동"}, {"별명" :"의적"} )

 

삭제-1 (remove)

#이름이 정길동인 데이터를 모두 삭제한다.
col.remove({"이름":"정길동"})

#데이터가 전체 삭제됨. 주의해야함
col.remove({})

remove 사용시 주의점은 의도치 않게 모든 데이터를 삭제시킬 수 있다는 점입니다. 나도 모르게 파일을 실행시켜버리면 모든 데이터가 날아가게되죠. 그래서 대안으로 사용할 수 있는 것이 delete 입니다.

 

삭제-2 (delete)

#데이터삭제_2 - delete_one 하나만 삭제
col.delete_one({"이름":"주길동"})

#delete_many 전체삭제
col.delete_many({"이름":"남길동"})

delete를 사용하면 의도치않게 모든 데이터를 삭제하는 실수를 방지할 수 있습니다.

반응형