from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbteddyjung
user = db.users.find_one({'name':'bobby'})
print(user)
# 그 중 특정 키 값을 빼고 보기
user = db.users.find_one({'name':'bobby'},{'_id':0})
print(user)
앞전에 데이터들을 db 에 넣어주었기 때문에 이제 특정 결과 값만 확인해보자.
find_one({'name':'bobby'}) 'name' 이 'bobby' 인 값의 결과를 다 가져와 라는 뜻.
# 아래 창 확인
{'_id': ObjectId('5e8e93cd627323eb47ed7a69'), 'name': 'bobby', 'age': 21}
{'_id': ObjectId('5e8e93cd627323eb47ed7a69'), 'name': 'bobby', 'age': 21}
보니까 결과 값에 id 가 나온다. id 가 출력되는 이유는 db에 데이터를 저장하면서 중복되어 저장되는 데이터가 있을 때, 데이터에 랜덤으로 다르게 부여되는 id 를 통해 컴퓨터가 데이터를 구별하는 것이 가능하게 된다.
user = db.users.find_one({'name':'bobby'},{'_id':0})
# {'_id':0} 또는 {'_id':False} 로 할 수 있다.
print(user)
# 결과
{'name': 'bobby', 'age': 21}
마찬가지로 'age' 를 빼고 볼 수도 있겠지. 근데 두 값 이상을 빼고 볼 방법은 없을까?
user = db.users.find_one({'name':'badguy'},{'_id':0, 'age':False})
print(user)
all_users = list(db.users.find())
find() : 괄호안이 없다. 전부 다 찾아줘. users 안에 있는 모든 정보를 다 꺼내와라. 그래서 그것을 목록화 list 화 해줘. 배열화(순서가 중요한 자료형) 해줘.
그거를 all_users 라 하자.
all_users 를 선언했으니 반복문을 통해 user 하나씩 차례대로 다 뽑아보자.
all_users = list(db.users.find())
for user in all_users:
print(user)
결과
{'_id': ObjectId('5e8e93cd627323eb47ed7a69'), 'name': 'bobby', 'age': 21}
{'_id': ObjectId('5e8e93cd627323eb47ed7a6a'), 'name': 'kay', 'age': 27}
{'_id': ObjectId('5e8e93cd627323eb47ed7a6b'), 'name': 'john', 'age': 30}
{'_id': ObjectId('5e8e93dfddb05d0ff805e3e6'), 'name': 'bobby', 'age': 21}
{'_id': ObjectId('5e8e93dfddb05d0ff805e3e7'), 'name': 'kay', 'age': 27}
{'_id': ObjectId('5e8e93dfddb05d0ff805e3e8'), 'name': 'john', 'age': 30}
Process finished with exit code 0
바로 위 코드를 보고서 문득 bobby 의 나이가 잘못 저장되었다고 느낀다. 전부 지금 6개 출력되고 있는데 어떻게 해야 일괄적으로 다 바꿀 수 있을까?
지금까지 insert, find, find_one 을 써봤었다. find() 는 모든 db 데이터를 다 찾아주는 거였고, find_one({}) 는 특정 조건을 찾아라 라는 뜻이였다.
이번에는 bobby 의 나이를 50 으로 일괄 수정하기 위해 update 를 쓰자
update 의 구성은,
db.users.update_one({})
db.users.update_many({})
일괄 수정을 위해서는 update_many 를 사용한다.
# 생김새
# db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
all_users = list(db.users.find())
db.users.update_many({'name':'badguy'},{'$set':{'age':20}})
for user in all_users:
print(user)
# 결과
{'_id': ObjectId('5e8ebc28cd89ce2d00f4ee81'), 'name': 'teddyjung', 'age': 33}
{'_id': ObjectId('5e8ebc28cd89ce2d00f4ee82'), 'name': 'badguy', 'age': 20}
{'_id': ObjectId('5e8ebc2e29be54591089b826'), 'name': 'teddyjung', 'age': 33}
{'_id': ObjectId('5e8ebc2e29be54591089b827'), 'name': 'badguy', 'age': 20}
{'_id': ObjectId('5e8ebc328e4b365b42857d84'), 'name': 'teddyjung', 'age': 33}
{'_id': ObjectId('5e8ebc328e4b365b42857d85'), 'name': 'badguy', 'age': 20}
update 와 방법이 같다. 잘 사용하지 않는다고 한다.
db.users.delete_one({'name':'bobby'})
all_user = list(db.users.find())
for user in all_user:
print(user)
# 결과
{'_id': ObjectId('5e8e93cd627323eb47ed7a6a'), 'name': 'kay', 'age': 27}
{'_id': ObjectId('5e8e93cd627323eb47ed7a6b'), 'name': 'john', 'age': 30}
{'_id': ObjectId('5e8e93dfddb05d0ff805e3e7'), 'name': 'kay', 'age': 27}
{'_id': ObjectId('5e8e93dfddb05d0ff805e3e8'), 'name': 'john', 'age': 30}
Process finished with exit code 0
실행을 두번 하니 두개 있던 바비가 사라졌다. 한번에 하는 뭔가가 있을거 같긴한데 아직은 욕심내지말아야겟다..
근데 데이터를 볼 때 항상 인쇄를 해서 봐야 하나?
Robo3T 를 하면 확인이 가능하다.