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":{"이름" :"박명수"}})
#이름 노홍철을 찾아 별명을 돌아이라고 수정해라. 단 노홍철이 없으면 생성 (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({"이름":"유재석"})