데이터베이스 NoSQL 기본 (mongoDB) - 예제로 이해하는 find 의 다양한 문법

7. 예제로 이해하는 find 의 다양한 문법

7.1. sort

  • mysql의 order by에 해당
  • find로 데이터 열람 시, 정렬 조건 명시 가능
# 기본적으로 오름차순
result = actor_collection.find().sort('actor_name')
for record in result:
    print(record)
{'_id': ObjectId('5a0ae08481f6402f8ff056bc'), 'actor_rate': 59361, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-01', '성별': '남', '홈페이지': 'https://www.instagram.com/madongseok_/\nhttps://twitter.com/madongseok12'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056be'), 'actor_rate': 40181, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c2'), 'actor_rate': 33487, 'date': '2017-10', 'movie_list': ['범죄도시', '이웃집 스타'], 'actor_name': '임형준', 'actor_info': {'직업': '배우', '생년월일': '1974-05-10', '성별': '남', '신장/체중': '177cm, 71kg', '학교': '서울예술대학 연극과', '취미': '스쿼시, 피아노', '특기': '작곡, 노래', '소속사': '나무액터스'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bf'), 'actor_rate': 37957, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bd'), 'actor_rate': 42733, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c0'), 'actor_rate': 35754, 'date': '2017-10', 'movie_list': ['범죄도시', '택시운전사', '조작된 도시'], 'actor_name': '최귀화', 'actor_info': {'직업': '배우', '생년월일': '1978-03-03', '성별': '남', '신장/체중': '181cm, 72kg'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c1'), 'actor_rate': 33659, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남'}}
result = actor_collection.find().sort('actor_name', pymongo.ASCENDING)
for record in result:
    print(record)
{'_id': ObjectId('5a0ae08481f6402f8ff056bc'), 'actor_rate': 59361, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-01', '성별': '남', '홈페이지': 'https://www.instagram.com/madongseok_/\nhttps://twitter.com/madongseok12'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056be'), 'actor_rate': 40181, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c2'), 'actor_rate': 33487, 'date': '2017-10', 'movie_list': ['범죄도시', '이웃집 스타'], 'actor_name': '임형준', 'actor_info': {'직업': '배우', '생년월일': '1974-05-10', '성별': '남', '신장/체중': '177cm, 71kg', '학교': '서울예술대학 연극과', '취미': '스쿼시, 피아노', '특기': '작곡, 노래', '소속사': '나무액터스'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bf'), 'actor_rate': 37957, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bd'), 'actor_rate': 42733, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c0'), 'actor_rate': 35754, 'date': '2017-10', 'movie_list': ['범죄도시', '택시운전사', '조작된 도시'], 'actor_name': '최귀화', 'actor_info': {'직업': '배우', '생년월일': '1978-03-03', '성별': '남', '신장/체중': '181cm, 72kg'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c1'), 'actor_rate': 33659, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남'}}
# 내림차순 명시
result = actor_collection.find().sort('actor_name', pymongo.DESCENDING)
for record in result:
    print(record)
{'_id': ObjectId('5a0ae08481f6402f8ff056c1'), 'actor_rate': 33659, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c0'), 'actor_rate': 35754, 'date': '2017-10', 'movie_list': ['범죄도시', '택시운전사', '조작된 도시'], 'actor_name': '최귀화', 'actor_info': {'직업': '배우', '생년월일': '1978-03-03', '성별': '남', '신장/체중': '181cm, 72kg'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bd'), 'actor_rate': 42733, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bf'), 'actor_rate': 37957, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c2'), 'actor_rate': 33487, 'date': '2017-10', 'movie_list': ['범죄도시', '이웃집 스타'], 'actor_name': '임형준', 'actor_info': {'직업': '배우', '생년월일': '1974-05-10', '성별': '남', '신장/체중': '177cm, 71kg', '학교': '서울예술대학 연극과', '취미': '스쿼시, 피아노', '특기': '작곡, 노래', '소속사': '나무액터스'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056be'), 'actor_rate': 40181, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bc'), 'actor_rate': 59361, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-01', '성별': '남', '홈페이지': 'https://www.instagram.com/madongseok_/\nhttps://twitter.com/madongseok12'}}
# sort by multiple fields
result = actor_collection.find().sort([('actor_name', pymongo.ASCENDING),
                            ('actor_rate', pymongo.DESCENDING)])

for record in result:
    print(record)
{'_id': ObjectId('5a0ae08481f6402f8ff056bc'), 'actor_rate': 59361, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-01', '성별': '남', '홈페이지': 'https://www.instagram.com/madongseok_/\nhttps://twitter.com/madongseok12'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056be'), 'actor_rate': 40181, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c2'), 'actor_rate': 33487, 'date': '2017-10', 'movie_list': ['범죄도시', '이웃집 스타'], 'actor_name': '임형준', 'actor_info': {'직업': '배우', '생년월일': '1974-05-10', '성별': '남', '신장/체중': '177cm, 71kg', '학교': '서울예술대학 연극과', '취미': '스쿼시, 피아노', '특기': '작곡, 노래', '소속사': '나무액터스'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bf'), 'actor_rate': 37957, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bd'), 'actor_rate': 42733, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c0'), 'actor_rate': 35754, 'date': '2017-10', 'movie_list': ['범죄도시', '택시운전사', '조작된 도시'], 'actor_name': '최귀화', 'actor_info': {'직업': '배우', '생년월일': '1978-03-03', '성별': '남', '신장/체중': '181cm, 72kg'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c1'), 'actor_rate': 33659, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남'}}

7.2. 필드값이 존재하는 경우 검색 예제 (exists)

  • embedded document 의 경우 검색 예제 포함
for doc in actor_collection.find({'actor_info.특기' : {'$exists' : False}}):
    print(doc)
{'_id': ObjectId('5a0995cd81f64002aac0bf1c'), 'actor_rate': 59190, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-01', '성별': '남', '홈페이지': 'https://www.instagram.com/madongseok_/\nhttps://twitter.com/madongseok12'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf1d'), 'actor_rate': 42900, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf1f'), 'actor_rate': 38068, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf20'), 'actor_rate': 35859, 'date': '2017-10', 'movie_list': ['범죄도시', '택시운전사', '조작된 도시'], 'actor_name': '최귀화', 'actor_info': {'직업': '배우', '생년월일': '1978-03-03', '성별': '남', '신장/체중': '181cm, 72kg'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf21'), 'actor_rate': 33732, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남'}}
for doc in actor_collection.find({'actor_info.생년월일' : {'$exists' : False}}):
    print(doc)
{'_id': ObjectId('5a0ae08481f6402f8ff056c1'), 'actor_rate': 33659, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남'}}
for doc in actor_collection.find({'actor_info.홈페이지' : {'$exists' : True}}):
    print(doc)
{'_id': ObjectId('5a0ae08481f6402f8ff056bc'), 'actor_rate': 59361, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-01', '성별': '남', '홈페이지': 'https://www.instagram.com/madongseok_/\nhttps://twitter.com/madongseok12'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056be'), 'actor_rate': 40181, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bf'), 'actor_rate': 37957, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
실습
생년월일이 없는 doc의 actor_name 만 출력하기
for doc in actor_collection.find({'actor_info' : {'$exists' : True}}):
    print(doc)
{'_id': ObjectId('5a0995cd81f64002aac0bf1c'), 'actor_rate': 59190, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-01', '성별': '남', '홈페이지': 'https://www.instagram.com/madongseok_/\nhttps://twitter.com/madongseok12'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf1d'), 'actor_rate': 42900, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf1e'), 'actor_rate': 40298, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf1f'), 'actor_rate': 38068, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf20'), 'actor_rate': 35859, 'date': '2017-10', 'movie_list': ['범죄도시', '택시운전사', '조작된 도시'], 'actor_name': '최귀화', 'actor_info': {'직업': '배우', '생년월일': '1978-03-03', '성별': '남', '신장/체중': '181cm, 72kg'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf21'), 'actor_rate': 33732, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남'}}
{'_id': ObjectId('5a0995cd81f64002aac0bf22'), 'actor_rate': 33585, 'date': '2017-10', 'movie_list': ['범죄도시', '이웃집 스타'], 'actor_name': '임형준', 'actor_info': {'직업': '배우', '생년월일': '1974-05-10', '성별': '남', '신장/체중': '177cm, 71kg', '학교': '서울예술대학 연극과', '취미': '스쿼시, 피아노', '특기': '작곡, 노래', '소속사': '나무액터스'}}

7.3. 필드의 범위로 검색 예제

  • gt, gte
    • gt : 크다, gte : 크거나 같다
  • lt, lte
    • lt : 작다, lte : 작거나 같다
for doc in actor_collection.find({'actor_rate' : {'$gte' : 40000}}):
    print(doc)
{'_id': ObjectId('5a0ae08481f6402f8ff056bc'), 'actor_rate': 59361, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-01', '성별': '남', '홈페이지': 'https://www.instagram.com/madongseok_/\nhttps://twitter.com/madongseok12'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bd'), 'actor_rate': 42733, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056be'), 'actor_rate': 40181, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
for doc in actor_collection.find(
                    {'actor_rate' : {'$lte' : 70000}, 
                     'actor_name' : '설경구' }
                    ):
    print(doc)
실습
actor_rate 가 <= 35000 인 doc의 배우 이름과 배우가 출연한 영화 리스트 출력하기
for doc in actor_collection.find( { 'actor_rate' : {'$lte' : 35000} }, { 'actor_name': 1, 'movie_list': 1, '_id':0 } ):
    print(doc)
{'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태'}
{'movie_list': ['범죄도시', '이웃집 스타'], 'actor_name': '임형준'}

7.4. or

test_insert 컬렉션으로 테스트를 해보겠습니다. (age 컬럼 활용)

username = 'davelee'
password = 'korea123'
connection = pymongo.MongoClient('mongodb://%s:%s@www.funcoding.xyz' % (username, password))
db = connection.test
test_collection = db.test_collection
for result in test_collection.find():
    print(result)
{'_id': ObjectId('5a01b4ba81f6400b2d7c677a'), 'author': 'Dave', 'text': 'My second blog post!', 'tags': ['mongodb', 'python', 'pymongo']}
{'_id': ObjectId('5a01b50ec607715c40efc075'), 'author': 'Dave', 'text': 'My second blog post!', 'tags': ['mongodb', 'python', 'pymongo']}
{'_id': ObjectId('5a01b539c607715c40efc076'), 'number': 0}
{'_id': ObjectId('5a01b539c607715c40efc077'), 'number': 1}
{'_id': ObjectId('5a01b539c607715c40efc078'), 'number': 2}
{'_id': ObjectId('5a01b539c607715c40efc079'), 'number': 3}
{'_id': ObjectId('5a01b539c607715c40efc07a'), 'number': 4}
{'_id': ObjectId('5a01b539c607715c40efc07b'), 'number': 5}
{'_id': ObjectId('5a01b54081f6400b2d7c677b'), 'number': 0}
{'_id': ObjectId('5a01b54081f6400b2d7c677c'), 'number': 1}
{'_id': ObjectId('5a01b54081f6400b2d7c677d'), 'number': 2}
{'_id': ObjectId('5a01b54081f6400b2d7c677e'), 'number': 3}
{'_id': ObjectId('5a01b54081f6400b2d7c677f'), 'number': 4}
{'_id': ObjectId('5a01b54081f6400b2d7c6780'), 'number': 5}
{'_id': ObjectId('5a09885481f64002aac0bf00'), 'author': 'Dave', 'text': 'My second blog post!', 'tags': ['mongodb', 'python', 'pymongo']}
{'_id': ObjectId('5a0988a881f64002aac0bf01'), 'number': 0}
{'_id': ObjectId('5a0988a881f64002aac0bf02'), 'number': 1}
{'_id': ObjectId('5a0988a881f64002aac0bf03'), 'number': 2}
{'_id': ObjectId('5a0988a881f64002aac0bf04'), 'number': 3}
{'_id': ObjectId('5a0988a881f64002aac0bf05'), 'number': 4}
{'_id': ObjectId('5a0988a881f64002aac0bf06'), 'number': 5}
{'_id': ObjectId('5a0ac8dd81f6402f8ff0569f'), 'author': 'Dave', 'text': 'My second blog post!', 'tags': ['mongodb', 'python', 'pymongo']}
{'_id': ObjectId('5a0ac93a81f6402f8ff056a0'), 'number': 0}
{'_id': ObjectId('5a0ac93a81f6402f8ff056a1'), 'number': 1}
{'_id': ObjectId('5a0ac93a81f6402f8ff056a2'), 'number': 2}
{'_id': ObjectId('5a0ac93a81f6402f8ff056a3'), 'number': 3}
{'_id': ObjectId('5a0ac93a81f6402f8ff056a4'), 'number': 4}
{'_id': ObjectId('5a0ac93a81f6402f8ff056a5'), 'number': 5}
for doc in test_insert_collection.find():
    print(doc)
{'_id': ObjectId('5a01b540c607715c40efc080'), 'title': '암살', 'castings': ['이정재', '전지현', '하정우']}
{'_id': ObjectId('5a01b540c607715c40efc081'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('5a01b541c607715c40efc082'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('5a01b541c607715c40efc083'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a01b541c607715c40efc084'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('5a01b541c607715c40efc085'), 'name': 'david', 'age': 27}
{'_id': ObjectId('5a01b541c607715c40efc086'), 'name': 'erick', 'age': 28}
{'_id': ObjectId('5a01b541c607715c40efc087'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('5a01b541c607715c40efc088'), 'name': 'hmm'}
{'_id': ObjectId('5a09890f81f64002aac0bf0b'), 'title': '암살', 'castings': ['이정재', '전지현', '하정우']}
{'_id': ObjectId('5a09890f81f64002aac0bf0c'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('5a09893f81f64002aac0bf0d'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('5a09893f81f64002aac0bf0e'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a09893f81f64002aac0bf0f'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('5a09893f81f64002aac0bf10'), 'name': 'david', 'age': 27}
{'_id': ObjectId('5a09893f81f64002aac0bf11'), 'name': 'erick', 'age': 28}
{'_id': ObjectId('5a09893f81f64002aac0bf12'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('5a09893f81f64002aac0bf13'), 'name': 'hmm'}
{'_id': ObjectId('5a0ac98881f6402f8ff056aa'), 'title': '암살', 'castings': ['이정재', '전지현', '하정우']}
{'_id': ObjectId('5a0ac98881f6402f8ff056ab'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ac'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ad'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ae'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('5a0ac9b681f6402f8ff056af'), 'name': 'david', 'age': 27}
{'_id': ObjectId('5a0ac9b681f6402f8ff056b0'), 'name': 'erick', 'age': 28}
{'_id': ObjectId('5a0ac9b681f6402f8ff056b1'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('5a0ac9b681f6402f8ff056b2'), 'name': 'hmm'}
for doc in test_insert_collection.find({'$or' : [ {'age' : 27}, {'age' : 30} ] }):
    print(doc)
{'_id': ObjectId('5a01b541c607715c40efc083'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a01b541c607715c40efc085'), 'name': 'david', 'age': 27}
{'_id': ObjectId('5a09893f81f64002aac0bf0e'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a09893f81f64002aac0bf10'), 'name': 'david', 'age': 27}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ad'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a0ac9b681f6402f8ff056af'), 'name': 'david', 'age': 27}
# name이 aaron이고, age가 20이거나 30인 doc
for doc in test_insert_collection.find({ 'name' : 'aaron', '$or' : [ { 'age' : {'$lte' : 20 } }, { 'age' : 30 } ] }):
    print(doc)
{'_id': ObjectId('5a01b541c607715c40efc082'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('5a09893f81f64002aac0bf0d'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ac'), 'name': 'aaron', 'age': 20}
for doc in test_insert_collection.find({'$or' : [ {'age' : { '$gte' : 29 } }, { 'age' : { '$lte' : 25 } } ] }):
    print(doc)
{'_id': ObjectId('5a01b541c607715c40efc082'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('5a01b541c607715c40efc083'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a01b541c607715c40efc084'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('5a01b541c607715c40efc087'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('5a09893f81f64002aac0bf0d'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('5a09893f81f64002aac0bf0e'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a09893f81f64002aac0bf0f'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('5a09893f81f64002aac0bf12'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ac'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ad'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ae'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('5a0ac9b681f6402f8ff056b1'), 'name': 'fox', 'age': 32}
# age가 29 이상이거나 25인 doc
for doc in test_insert_collection.find( {'$or' : [ {'age' : {'$gte' : 29 } }, { 'age' : 25 } ] } ):
    print(doc)
{'_id': ObjectId('5a01b541c607715c40efc083'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a01b541c607715c40efc084'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('5a01b541c607715c40efc087'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('5a09893f81f64002aac0bf0e'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a09893f81f64002aac0bf0f'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('5a09893f81f64002aac0bf12'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ad'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('5a0ac9b681f6402f8ff056ae'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('5a0ac9b681f6402f8ff056b1'), 'name': 'fox', 'age': 32}
  • 조건: age >= 27 or name = 'fox'
  • 출력: name, age
for doc in test_insert_collection.find( {'$or' : [ {'age' : {'$gte' : 27 } }, { 'name' : 'fox' } ] }, {'_id':0} ):
    print(doc)
{'name': 'bob', 'age': 30}
{'name': 'david', 'age': 27}
{'name': 'erick', 'age': 28}
{'name': 'fox', 'age': 32}
{'name': 'bob', 'age': 30}
{'name': 'david', 'age': 27}
{'name': 'erick', 'age': 28}
{'name': 'fox', 'age': 32}
{'name': 'bob', 'age': 30}
{'name': 'david', 'age': 27}
{'name': 'erick', 'age': 28}
{'name': 'fox', 'age': 32}
# age가 29 이상이거나 25인 doc
for doc in test_insert_collection.find({'$or' : [ {'age' : {'$gte' : 27}}, {'name' : 'fox'}]}, {'name':1, 'age':1, '_id':0}):
    print(doc)
{'name': 'bob', 'age': 30}
{'name': 'david', 'age': 27}
{'name': 'erick', 'age': 28}
{'name': 'fox', 'age': 32}
{'name': 'bob', 'age': 30}
{'name': 'david', 'age': 27}
{'name': 'erick', 'age': 28}
{'name': 'fox', 'age': 32}

7.5. nor

  • not or
for doc in test_insert_collection.find({'$nor' : [{'age' : {'$gte' : 29}}, {'age' : 25}]}):
    print(doc)
{'_id': ObjectId('59ea1a0471f3ec3a5a4f7a47'), 'title': '암살', 'castings': ['이정재', '전지현', '하정우']}
{'_id': ObjectId('59ea1a0471f3ec3a5a4f7a48'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a49'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4c'), 'name': 'david', 'age': 27}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4d'), 'name': 'erick', 'age': 28}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4f'), 'name': 'hmm'}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a58'), 'title': '암살', 'castings': ['이정재', '전지현', '하정우']}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a59'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5a'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5d'), 'name': 'david', 'age': 27}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5e'), 'name': 'erick', 'age': 28}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a60'), 'name': 'hmm'}

7.6. in, nin

# age가 해당 리스트안에 존재하는 원소와 일치할 떄
for doc in test_insert_collection.find({'age' : {'$in' : [20, 21, 25, 27]}}):
    print(doc)
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a49'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4b'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4c'), 'name': 'david', 'age': 27}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5a'), 'name': 'aaron', 'age': 20}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5c'), 'name': 'cathy', 'age': 25}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5d'), 'name': 'david', 'age': 27}
# nin : not in
for doc in test_insert_collection.find({'age' : {'$nin' : [20, 21, 25, 27]}}):
    print(doc)
{'_id': ObjectId('59ea1a0471f3ec3a5a4f7a47'), 'title': '암살', 'castings': ['이정재', '전지현', '하정우']}
{'_id': ObjectId('59ea1a0471f3ec3a5a4f7a48'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4a'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4d'), 'name': 'erick', 'age': 28}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4e'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4f'), 'name': 'hmm'}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a58'), 'title': '암살', 'castings': ['이정재', '전지현', '하정우']}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a59'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5b'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5e'), 'name': 'erick', 'age': 28}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5f'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a60'), 'name': 'hmm'}

7.7. skip, limit

  • skip(n) : 검색 결과 n개만큼 건너뜀
  • limit(n) : 검색 결과 n개로 제한
for doc in test_insert_collection.find({'age' : {'$nin' : [20, 21, 25, 27]}}).skip(3):
    print(doc)
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4d'), 'name': 'erick', 'age': 28}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4e'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4f'), 'name': 'hmm'}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a58'), 'title': '암살', 'castings': ['이정재', '전지현', '하정우']}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a59'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5b'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5e'), 'name': 'erick', 'age': 28}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a5f'), 'name': 'fox', 'age': 32}
{'_id': ObjectId('59eaaf3a71f3ec3a5a4f7a60'), 'name': 'hmm'}
for doc in test_insert_collection.find({'age' : {'$nin' : [20, 21, 25, 27]}}).limit(3):
    print(doc)
{'_id': ObjectId('59ea1a0471f3ec3a5a4f7a47'), 'title': '암살', 'castings': ['이정재', '전지현', '하정우']}
{'_id': ObjectId('59ea1a0471f3ec3a5a4f7a48'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4a'), 'name': 'bob', 'age': 30}
# skip limit 동시 사용 가능
for doc in test_insert_collection.find({'age' : {'$nin' : [20, 21, 25, 27]}}).skip(1).limit(3):
    print(doc)
{'_id': ObjectId('59ea1a0471f3ec3a5a4f7a48'), 'title': '실미도', 'castings': ['설경구', '안성기'], 'datetime': {'year': '2003', 'month': 3, 'val': {'a': {'b': 1}}}}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4a'), 'name': 'bob', 'age': 30}
{'_id': ObjectId('59ea1a0571f3ec3a5a4f7a4d'), 'name': 'erick', 'age': 28}

7.7. list 검색

import pymongo

username = 'davelee'
password = 'korea123'
connection = pymongo.MongoClient('mongodb://%s:%s@www.funcoding.xyz' % (username, password))
mongodb = connection.cine21
actor_collection = mongodb.actor_collection
# 영화 리스트에 범죄도시를 포함하는 경우
for doc in actor_collection.find({'movie_list' : '범죄도시'}):
    print(doc['actor_name'])
마동석
진선규
윤계상
조재윤
최귀화
허성태
임형준
# 영화 리스트에 범죄도시 또는 수상한 그녀를 포함하는 경우
for doc in actor_collection.find({'$or' : [{'movie_list' : '범죄도시'}, {'movie_list' : '수상한 그녀'}]}):
    print(doc['actor_name'])
마동석
진선규
윤계상
조재윤
최귀화
허성태
임형준
# 영화 리스트에 범죄도시와 택시운전사를 포함하는 경우
for doc in actor_collection.find({'movie_list' : '범죄도시', 'movie_list' : '택시운전사'}):
    print(doc['actor_name'])
최귀화
  • 리스트로 비교하기 위해서는 순서와 값이 정확히 일치해야 함
# 결과 없음
for doc in actor_collection.find({'movie_list' : ['부라더', '범죄도시']}):
    print(doc['actor_name'])
for doc in actor_collection.find({'movie_list' : ['범죄도시', '남한산성']}):
    print(doc['actor_name'])
진선규
  • 순서에 관계 없이 찾고자 하는 경우
# 영화 리스트에 부라더와 범죄도시를 순서와 관계없이 포함하는 경우
for doc in actor_collection.find({'movie_list' : {'$all' :  ['부라더', '범죄도시'] }} ):
    print(doc['actor_name'])
마동석
허성태
# 영화 리스트에 부라더와 범죄도시를 순서와 관계없이 포함하는 경우
for doc in actor_collection.find({'movie_list' : {'$all' :  ['택시운전사', '범죄도시'] }} ):
    print(doc['actor_name'])
최귀화
# 영화 리스트에 수상한 그녀를 순서와 관계없이 포함하는 경우
for doc in actor_collection.find({'movie_list' : {'$all' :  ['수상한 그녀'] }} ):
    print(doc['actor_name'])
  • elemMatch
    • 적어도 한개 이상의 원소가 복수개의 조건을 동시에 만족하는 경우
    • 조건이 한개인 경우는 사용하지 않음
score = mongodb.test.score
for doc in score.find():
    print(doc)
{'_id': ObjectId('5a099d9f81f64002aac0bf25'), 'results': [82, 85, 88]}
{'_id': ObjectId('5a099d9f81f64002aac0bf26'), 'results': [75, 88, 89]}
{'_id': ObjectId('5a0a7e6681f6401787fdff7e'), 'results': [82, 85, 88]}
{'_id': ObjectId('5a0a7e6681f6401787fdff7f'), 'results': [75, 88, 91]}
score.insert_many([
{ 'results': [ 82, 85, 88 ] },
{ 'results': [ 75, 88, 91 ] }])
Out[142]:
<pymongo.results.InsertManyResult at 0x106c88108>
# 각 조건별로 하나라도 만족하는 원소가 있을 경우
for doc in score.find({'results' : { '$gte': 90, '$lt': 85 }}):
    print(doc)
{'_id': ObjectId('5a0a7e6681f6401787fdff7f'), 'results': [75, 88, 91]}
# 적어도 한개의 원소(82) 가 모든 조건을 만족하는 경우 (80 <= 82 <= 85)
for doc in score.find({'results' :  {'$elemMatch' : { '$gte': 80, '$lt': 85 }}}):
    print(doc)
{'_id': ObjectId('5a099d9f81f64002aac0bf25'), 'results': [82, 85, 88]}
{'_id': ObjectId('5a0a7e6681f6401787fdff7e'), 'results': [82, 85, 88]}
  • 인덱스를 특정하여 검색하기
# movie_list의 1번째 원소가 범죄도시인 것 검색
for doc in actor_collection.find({'movie_list.0' : '범죄도시'} ):
    print(doc['actor_name'])
마동석
진선규
윤계상
조재윤
최귀화
임형준
# movie_list의 2번째 원소가 범죄도시인 것 검색
for doc in actor_collection.find({'movie_list.1' : '범죄도시'} ):
    print(doc['actor_name'])
허성태
  • 리스트의 원소의 개수를 기준으로 검색 (정확한 개수로만 검색 가능)
for doc in actor_collection.find({'movie_list' : {'$size' : 3}} ):
    print(doc['actor_name'])
마동석
윤계상
최귀화
허성태

7.8. Update 예제

result = actor_collection.update_one(
    {'actor_name' : '마동석'}, 
    {
        '$set' : 
        {
            'actor_info.생년월일' : '1971-03-03', 
            'actor_info.홈페이지' : 'https://www.instagram.com/madongseok'
        }
    }
)
result.modified_count
Out[147]:
1
# update_many로 매칭되는 모든 doc 업데이트
result = actor_collection.update_many({'actor_info.성별' : '남'}, {'$set' : {'actor_info.성별' : '남자'}})
result.modified_count
Out[149]:
7
# update_many로 매칭되는 모든 doc 업데이트
result = actor_collection.update_many({'actor_info.성별' : '여'}, {'$set' : {'actor_info.성별' : '여자'}})
result.modified_count
Out[151]:
0
for doc in actor_collection.find():
    print(doc)
{'_id': ObjectId('5a0ae08481f6402f8ff056bc'), 'actor_rate': 59361, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-03', '성별': '남자', '홈페이지': 'https://www.instagram.com/madongseok'}, 'actor_details': {'생년월일': '1971-03-03', '홈페이지': 'https://www.instagram.com/madongseok'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bd'), 'actor_rate': 42733, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남자'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056be'), 'actor_rate': 40181, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남자', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bf'), 'actor_rate': 37957, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남자', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c0'), 'actor_rate': 35754, 'date': '2017-10', 'movie_list': ['범죄도시', '택시운전사', '조작된 도시'], 'actor_name': '최귀화', 'actor_info': {'직업': '배우', '생년월일': '1978-03-03', '성별': '남자', '신장/체중': '181cm, 72kg'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c1'), 'actor_rate': 33659, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남자'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c2'), 'actor_rate': 33487, 'date': '2017-10', 'movie_list': ['범죄도시', '이웃집 스타'], 'actor_name': '임형준', 'actor_info': {'직업': '배우', '생년월일': '1974-05-10', '성별': '남자', '신장/체중': '177cm, 71kg', '학교': '서울예술대학 연극과', '취미': '스쿼시, 피아노', '특기': '작곡, 노래', '소속사': '나무액터스'}}
  • upsert option
    • update method의 upsert parameter가 True로 전달하면, 매칭되는 document를 찾지 못한 경우, insert 수행
result = actor_collection.update_many({'actor_name' : '오달수'}, 
                           {'$set' : {'actor_name' : '오달수', 'actor_rate' : 42230}}, 
                           upsert=True)
result.modified_count
Out[154]:
0
dir(result)
Out[155]:
['_UpdateResult__acknowledged',
 '_UpdateResult__raw_result',
 '_WriteResult__acknowledged',
 '__class__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__slots__',
 '__str__',
 '__subclasshook__',
 '_raise_if_unacknowledged',
 'acknowledged',
 'matched_count',
 'modified_count',
 'raw_result',
 'upserted_id']
# 새로 삽입된 객체의 아이디
result.upserted_id
Out[156]:
ObjectId('5a0ae84ce8393b01d3212e0a')
result = actor_collection.update_one({'actor_name' : '류승룡'}, 
                           {'$set' : {'actor_name' : '류승룡', 'actor_rate' : 42230}}, 
                           upsert=True)
result.modified_count
Out[158]:
0
# 새로 삽입된 객체의 아이디
result.upserted_id
Out[159]:
ObjectId('5a0ae85be8393b01d3212e1d')
result = actor_collection.update_one({'actor_name' : '유해진'}, 
                           {'$set' : {'actor_name' : '유해진', 'actor_rate' : 42230}}, 
                           upsert=True)
# 새로 삽입된 객체의 아이디
result.upserted_id
Out[161]:
ObjectId('5a0ae861e8393b01d3212e23')
for doc in actor_collection.find():
    print(doc)
{'_id': ObjectId('5a0ae08481f6402f8ff056bc'), 'actor_rate': 59361, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-03', '성별': '남자', '홈페이지': 'https://www.instagram.com/madongseok'}, 'actor_details': {'생년월일': '1971-03-03', '홈페이지': 'https://www.instagram.com/madongseok'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bd'), 'actor_rate': 42733, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남자'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056be'), 'actor_rate': 40181, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남자', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bf'), 'actor_rate': 37957, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남자', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c0'), 'actor_rate': 35754, 'date': '2017-10', 'movie_list': ['범죄도시', '택시운전사', '조작된 도시'], 'actor_name': '최귀화', 'actor_info': {'직업': '배우', '생년월일': '1978-03-03', '성별': '남자', '신장/체중': '181cm, 72kg'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c1'), 'actor_rate': 33659, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남자'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c2'), 'actor_rate': 33487, 'date': '2017-10', 'movie_list': ['범죄도시', '이웃집 스타'], 'actor_name': '임형준', 'actor_info': {'직업': '배우', '생년월일': '1974-05-10', '성별': '남자', '신장/체중': '177cm, 71kg', '학교': '서울예술대학 연극과', '취미': '스쿼시, 피아노', '특기': '작곡, 노래', '소속사': '나무액터스'}}
{'_id': ObjectId('5a0ae84ce8393b01d3212e0a'), 'actor_name': '오달수', 'actor_rate': 42230}
{'_id': ObjectId('5a0ae85be8393b01d3212e1d'), 'actor_name': '류승룡', 'actor_rate': 42230}
{'_id': ObjectId('5a0ae861e8393b01d3212e23'), 'actor_name': '유해진', 'actor_rate': 42230}

7.9. Delete 예제

result = actor_collection.delete_one({'actor_name' : '오달수'})
print (result.deleted_count)

result = actor_collection.delete_many({'name' : '오바마'})
print (result.deleted_count)
1
0
result = actor_collection.delete_one({'actor_name' : '오달수'})
result = actor_collection.delete_many({'actor_rate' : 42230})
for doc in actor_collection.find():
    print(doc)
{'_id': ObjectId('5a0ae08481f6402f8ff056bc'), 'actor_rate': 59361, 'date': '2017-10', 'movie_list': ['범죄도시', '부라더', '부산행'], 'actor_name': '마동석', 'actor_info': {'직업': '배우', '생년월일': '1971-03-03', '성별': '남자', '홈페이지': 'https://www.instagram.com/madongseok'}, 'actor_details': {'생년월일': '1971-03-03', '홈페이지': 'https://www.instagram.com/madongseok'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bd'), 'actor_rate': 42733, 'date': '2017-10', 'movie_list': ['범죄도시', '남한산성'], 'actor_name': '진선규', 'actor_info': {'직업': '배우', '생년월일': '1977-09-13', '성별': '남자'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056be'), 'actor_rate': 40181, 'date': '2017-10', 'movie_list': ['범죄도시', '발레 교습소', '죽여주는 여자'], 'actor_name': '윤계상', 'actor_info': {'다른 이름': '지오디;god', '직업': '배우', '생년월일': '1978-12-20', '성별': '남자', '홈페이지': 'https://www.facebook.com/saram.yoonkyesang\nhttps://www.instagram.com/kyesang78/', '신장/체중': '182cm, 62kg', '학교': '경희대학교 포스트모던학과 휴학', '취미': '컴퓨터게임, 스노우보드', '특기': '표정연기, 춤추기'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056bf'), 'actor_rate': 37957, 'date': '2017-10', 'movie_list': ['범죄도시', '역모 - 반란의 시대'], 'actor_name': '조재윤', 'actor_info': {'직업': '배우', '생년월일': '1974-09-15', '성별': '남자', '홈페이지': 'https://www.instagram.com/jojaeyun/'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c0'), 'actor_rate': 35754, 'date': '2017-10', 'movie_list': ['범죄도시', '택시운전사', '조작된 도시'], 'actor_name': '최귀화', 'actor_info': {'직업': '배우', '생년월일': '1978-03-03', '성별': '남자', '신장/체중': '181cm, 72kg'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c1'), 'actor_rate': 33659, 'date': '2017-10', 'movie_list': ['남한산성', '범죄도시', '부라더'], 'actor_name': '허성태', 'actor_info': {'직업': '배우', '성별': '남자'}}
{'_id': ObjectId('5a0ae08481f6402f8ff056c2'), 'actor_rate': 33487, 'date': '2017-10', 'movie_list': ['범죄도시', '이웃집 스타'], 'actor_name': '임형준', 'actor_info': {'직업': '배우', '생년월일': '1974-05-10', '성별': '남자', '신장/체중': '177cm, 71kg', '학교': '서울예술대학 연극과', '취미': '스쿼시, 피아노', '특기': '작곡, 노래', '소속사': '나무액터스'}}