Python mongo db 접속 생성 검색 삭제

이민기·2022년 5월 5일
0

insert

import pymongo

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

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

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


people = {
    "이름" : "유재석",
    "나이" :50,
    "별명" : "메뚜기"
    }
    
# 정보 삽입 (반복해서 수행할 경우 같은 정보가 계속 인서트 됩니다.)
col.insert(people)

정보가 insert 됩니다. id값은 자동 생성 됩니다. '_id'

검색

#해당 컬렉션에서 전체 데이터 가져 오기
all_serch = col.find()

#for문을 돌려 하나씩 print
for q in all_serch:
	print(q)
    
#특정 조건 검색

#이름의 값이 유재석인것을 모두 가져옴
all_serch_data = col.find({"이름":"유재석"})

#이름의 값이 유재석이고 나이 값이 50인것을 가쟈옴
all_serch_data = col.find({"이름":"유재석"}, {"나이":50})

#이름이 유재석이거나 나이가 40인것을 가져옴 OR
all_serch_data = col.find({"$or" : [ {"이름":"유재석"} , {"나이":40} ] } )

#이름이 유재석인 맨처음값 하나만 가져옴
result = col.find_one({"이름":"유재석"})

# 나이가 40보다 큰 사람을 찾음
result = col.find({"나이": {"$gt" : 40} })   #$gte = 크거나 같거나 (40도 포함됨)

#나이가 40보다 크고 50보다 작은 경우
result = col.find({"나이": {"$gt" : 40, "$lt": 50} })   #$lte = 작거나 같거나 (50도 포함됨)

#나이가 40보다 크고 50보다 작은 데이터의 나이만 보고 싶을때
result = col.find({"나이": {"$gt" : 40, "$lte": 50}},{"나이":True})

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

#limit(4) 결과를 4개만 보겠다.
result = col.find().limit(4)

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

#순위가 20~30까지 데이터
temp = db_opgg_rank.find({}, {'닉네임': 1, '순위':1, '_id':0}).skip(19).limit(11)

#상위 10개 데이터 중 레벨로 내림차순 정렬
#내림차순 pymongo.DESCENDING , 오름차순 pymongo.ASCENDING
temp = db_opgg_rank.find({}, {'닉네임': 1, '순위': 1, '레벨': 1, '_id': 0}).sort('레벨', pymongo.DESCENDING).limit(10)

#두가지 형태로 정렬가능 다만 앞에가 우선
temp = db_opgg_rank.find({}, {'닉네임': 1, '순위': 1, '레벨': 1, '_id': 
0}).sort([('레벨', pymongo.DESCENDING), ('순위', pymongo.ASCENDING)]).limit(10)

#소속팀이 존재하는 데이터만 조회
temp = db_opgg_rank.find({'소속팀': {'$exists': True}}, {'소속팀': 1, '닉네임': 1, '_id': 0})

#순위가 5등이상이거나 195등 이하인 유저들을 조회
temp = db_opgg_rank.find({'$or': [{'순위': {'$lte': 5}}, {'순위': {'$gte': 195}}]}, {'닉네임': 1, '순위': 1, '_id': 0})


#모스트 챔피언 kai'sa를 찾고 그중 분당cs가 9이상의 유저 3명을 뽑는다. 아이디값은 출력하지않는다.
temp = rank.find({'모스트챔피언': {'$elemMatch': {'챔피언이름': "Kai'Sa", '분당CS': {'$gte': 9}}}}, {'닉네임': 1, '모스트챔피언': {'챔피언이름': 1, '분당CS': 1}, '_id': 0}).limit(3)

#$all 조회가능
#각 시즌 티어 중 첼린저와 그랜드마스터 모두 였던 적이 있는 유저.
temp = db_opgg_rank.find({'전시즌티어': {'$all': ['첼린저', '그랜드마스터']}}, {'닉네임': 1, '_id': 0, '전시즌티어': 1})

#인덱스가 생성된 필드를 조회할때information 출력
print(db_opgg_rank.index_information())



#전시즌 골드가 포함되면 검색
temp = db_opgg_rank.find({'전시즌티어': '골드'}, {'닉네임': 1, '_id': 0, '전시즌티어': 1})



#array 검색
#.으로 하위 배열 검색
result = col.find({"이름.성별":"남자"}).pretty()

업데이트

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


# 유재석을 찾아 박명수로 바꿔라. 맨 위에 있는 데이터만 수정됨.
col.update({"이름":"유재석"}, {"$set":{"이름" :"박명수"}})


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

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

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

col.update({"이름":"유재석"}, {"$set":{"이름" :"박명수"}})

업서트 (UPDATE & INSERT)

#이름 노홍철을 찾아 별명을 돌아이라고 수정해라. 단 노홍철이 없으면 생성 (upsert = update+insert)
col.update({"이름":"노홍철"}, {"$set":{"별명" :"돌아이"}},upsert =True, multi = True)

삭제

#이름이 유재석인 데이터를 모두 삭제한다.
col.remove({"이름":"유재석"})

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

#데이터삭제_2 - delete_one 하나만 삭제
col.delete_one({"이름":"유재석"})

#delete_many 전체삭제
col.delete_many({"이름":"유재석"})
profile
지나가는사람

0개의 댓글