관리 메뉴

솜씨좋은장씨

[MongoDB] Python과 Pymongo를 활용하여 데이터 추가하고 출력해보기! 본문

Programming/NoSQL

[MongoDB] Python과 Pymongo를 활용하여 데이터 추가하고 출력해보기!

솜씨좋은장씨 2020. 3. 29. 20:03
728x90
반응형

오늘은 python과 pymongo를 통해 mongoDB에 데이터를 추가하고 추가한 데이터를 출력해보고자 합니다.

 

1. 실행환경

- OS : Mac OS Catalina

- IDE : Pycharm

 

2. mongoDB 설치하기

먼저 python과 pymongo를 활용하여 DB에 접근하고 데이터를 추가하거나 출력하려면 

mongoDB를 설치해주어야 합니다.

설치과정은 아래의 링크에서 확인할 수 있습니다.

 

2-1. OS X

 

[MAC OSX]MAC에 MongoDB설치하기!

1. 설치파일 다운로드 받기 Download Center: Community Server Download MongoDB Community Server, the most popular non-relational database built to address the needs of modern applications. www.mongodb..

somjang.tistory.com

 

[mac OS Catalina]무결성을 확인할 수 없기 때문에'mongod'을(를) 열 수 없습니다.

현재 저는 맥북프로에서 macOS Catalina 베타8 버전을 사용하고 있습니다. mongodb를 설치하고 나서 $ mongod 를 실행하니 무결성을 확인할 수 없기 때문에 mongod를 열 수 없습니다! 라는 알림과 함께 휴지통으..

somjang.tistory.com

2-2. Windows

 

[Windows]Mongodb설치하고 환경변수 설정하기(ver 4.2.0)

1. 설치파일 다운로드 받기 Download Center: Community Server Download MongoDB Community Server, the most popular non-relational database built to address the needs of modern applications. www.mongodb..

somjang.tistory.com

 

3. pymongo 설치하기

pip install pymongo

먼저 위의 명령어로 pymongo를 설치해주었습니다.

 

4. mongoDB 서버 실행하기

mongod --dbpath=data/db

위의 명령어로 mongoDB 서버를 실행시켜 줍니다.

 

5. pycharm에서 mongoDB 연결하기

from pymongo import MongoClient

my_client = MongoClient("mongodb://localhost:27017/")

설치한 pymongo에서 MongoClient를 import 해주고 이를 이용하여 mongoDB와 연결해줍니다.

 

잘 연결되었는지 확인해보기위해서 다음의 코드를 추가하여 실행하여봅니다.

print(my_client.list_database_names())
['admin', 'config', 'local']

잘 연결이 되었다면 위와 같은 결과를 얻을 수 있습니다.

현재 이 db에 존재하는 database의 이름을 확인할 수 있습니다.

 

mongo 명령어를 통해 열어서 사용하는 client에서

다음의 명령어를 사용하여 확인하는 것과 비슷한 결과를 얻을 수 있습니다.

show dbs
admin               0.000GB
config              0.000GB
local               0.000GB

 

이때 4번의 과정을 실행하지 않는다면 다음과 같은 오류가 발생됩니다.

Traceback (most recent call last):
  File "AddDataToMongoDBFromCSV.py", line 109, in <module>
    for x in my_doc:
  File "/Users/donghyunjang/PycharmProjects/MovieFlaskAPI/venv/lib/python3.7/site-packages/pymongo/cursor.py", line 1156, in next
    if len(self.__data) or self._refresh():
  File "/Users/donghyunjang/PycharmProjects/MovieFlaskAPI/venv/lib/python3.7/site-packages/pymongo/cursor.py", line 1050, in _refresh
    self.__session = self.__collection.database.client._ensure_session()
  File "/Users/donghyunjang/PycharmProjects/MovieFlaskAPI/venv/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1810, in _ensure_session
    return self.__start_session(True, causal_consistency=False)
  File "/Users/donghyunjang/PycharmProjects/MovieFlaskAPI/venv/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1763, in __start_session
    server_session = self._get_server_session()
  File "/Users/donghyunjang/PycharmProjects/MovieFlaskAPI/venv/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1796, in _get_server_session
    return self._topology.get_server_session()
  File "/Users/donghyunjang/PycharmProjects/MovieFlaskAPI/venv/lib/python3.7/site-packages/pymongo/topology.py", line 485, in get_server_session
    None)
  File "/Users/donghyunjang/PycharmProjects/MovieFlaskAPI/venv/lib/python3.7/site-packages/pymongo/topology.py", line 209, in _select_servers_loop
    self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 61] Connection refused

 

6. 데이터 하나 추가하기

먼저 test db의 customers라는 collection에 이름과 주소를 가지는 Document 하나를 추가해보겠습니다.

from pymongo import MongoClient
import pandas as pd

my_client = MongoClient("mongodb://localhost:27017/")
# print(my_client.list_database_names())

mydb = my_client['test']
mycol = mydb['customers']

x = mycol.insert_one({"name":"SOMJANG", "address":"Dongjakgu, Seoul"})
print(x.inserted_id)

아까 연결해두었던 mongoDB에서 test db의 customers라는 collection에

{"name":"SOMJANG", "address":"Dongjackgu, Seoul"} Document하나를 추가해주었습니다.

 

이는 mongo client에서 다음의 명령어와 같은 결과를 얻을 수 있습니다.

use test
db.customers.insert({"name":"SOMJANG", "address":"Dongjakgu, Seoul"})

 

7. 데이터 여러개 한번에 추가하기

항상 데이터를 한번에 하나씩 추가해야하는 것인가 한다면

한번에 여러개를 추가할 수 있는 방법도 있습니다.

동일하게 test db의 customers 라는 collection에 세명의 이름, 주소를 가지고 있는

세 개의 Document를 한번에 추가해보도록 하겠습니다.

from pymongo import MongoClient
import pandas as pd

my_client = MongoClient("mongodb://localhost:27017/")
# print(my_client.list_database_names())

mydb = my_client['test']
mycol = mydb['customers']

my_dict = [{"name":"PUTTY", "address":"SSH World, Network"},
           {"name":"donghyunjang", "address":"Seoul, Korea"},
           {"name":"Avengers", "address":"Avengers Team Building, USA"}]

x = mycol.insert_many(my_dict)
print(x.inserted_ids)

추가할 데이터를 list형태로 로 만들고 이를 insert_many를 활용하여 한번에 추가할 수 있습니다.

 

이는 mongo client에서 다음의 명령어와 같은 결과를 얻을 수 있습니다.

use test
db.customers.insert([{"name":"PUTTY", "address":"SSH World, Network"},
           	{"name":"donghyunjang", "address":"Seoul, Korea"},
           	{"name":"Avengers", "address":"Avengers Team Building, USA"}])

 

8. 추가한 데이터 출력해보기

이렇게 추가한 데이터가 잘 추가가 되어있는지 출력해보고자 합니다.

출력해보는 코드는 다음과 같습니다.

 

8-1. 하나만 출력해보기

from pymongo import MongoClient

my_client = MongoClient("mongodb://localhost:27017/")

mydb = my_client['test']
mycol = mydb['customers']

x = mycol.find_one()
print(x)

다음과 같이 하나만 출력이 되는 것을 볼 수 있습니다.

(venv) (base) DongHyunui-MacBook-Pro:MovieFlaskAPI donghyunjang$ python AddDataToMongoDBFromCSV.py 
{'_id': ObjectId('5e80876d143a7c2183ac3d93'), 'name': 'SOMJANG', 'address': 'Dongjakgu, Seoul'}

 

8-2. 여러개 출력해보기

from pymongo import MongoClient

my_client = MongoClient("mongodb://localhost:27017/")

mydb = my_client['test']
mycol = mydb['customers']

list = mycol.find()

for x in list:
    print(x)

다음과 같이 아까 추가했던 모든 Document가 출력이 되는 것을 볼 수 있습니다.

(venv) (base) DongHyunui-MacBook-Pro:MovieFlaskAPI donghyunjang$ python AddDataToMongoDBFromCSV.py 
{'_id': ObjectId('5e80876d143a7c2183ac3d93'), 'name': 'SOMJANG', 'address': 'Dongjakgu, Seoul'}
{'_id': ObjectId('5e8087fb2c7b4e51af20f835'), 'name': 'PUTTY', 'address': 'SSH World, Network'}
{'_id': ObjectId('5e8087fb2c7b4e51af20f836'), 'name': 'donghyunjang', 'address': 'Seoul, Korea'}
{'_id': ObjectId('5e8087fb2c7b4e51af20f837'), 'name': 'Avengers', 'address': 'Avengers Team Building, USA'}

 

8-3. 이름 기준 오름차순으로 출력해보기

from pymongo import MongoClient
import pandas as pd

my_client = MongoClient("mongodb://localhost:27017/")

mydb = my_client['test']
mycol = mydb['customers']

my_doc = mycol.find().sort("name")
for x in my_doc:
    print(x)

다음과 같이 이름을 기준으로 오름차순으로 정렬되어 출력되는 것을 볼 수 있습니다.

(venv) (base) DongHyunui-MacBook-Pro:MovieFlaskAPI donghyunjang$ python AddDataToMongoDBFromCSV.py 
{'_id': ObjectId('5e8087fb2c7b4e51af20f837'), 'name': 'Avengers', 'address': 'Avengers Team Building, USA'}
{'_id': ObjectId('5e8087fb2c7b4e51af20f835'), 'name': 'PUTTY', 'address': 'SSH World, Network'}
{'_id': ObjectId('5e80876d143a7c2183ac3d93'), 'name': 'SOMJANG', 'address': 'Dongjakgu, Seoul'}
{'_id': ObjectId('5e8087fb2c7b4e51af20f836'), 'name': 'donghyunjang', 'address': 'Seoul, Korea'}

 

8-4. 이름 기준 내림차순으로 출력해보기

from pymongo import MongoClient
import pandas as pd

my_client = MongoClient("mongodb://localhost:27017/")

mydb = my_client['test']
mycol = mydb['customers']

my_doc = mycol.find().sort("name", -1)
for x in my_doc:
    print(x)

다음과 같이 이름을 기준으로 내림차순으로 정렬되어 출력되는 것을 볼 수 있습니다.

(venv) (base) DongHyunui-MacBook-Pro:MovieFlaskAPI donghyunjang$ python AddDataToMongoDBFromCSV.py 
{'_id': ObjectId('5e8087fb2c7b4e51af20f836'), 'name': 'donghyunjang', 'address': 'Seoul, Korea'}
{'_id': ObjectId('5e80876d143a7c2183ac3d93'), 'name': 'SOMJANG', 'address': 'Dongjakgu, Seoul'}
{'_id': ObjectId('5e8087fb2c7b4e51af20f835'), 'name': 'PUTTY', 'address': 'SSH World, Network'}
{'_id': ObjectId('5e8087fb2c7b4e51af20f837'), 'name': 'Avengers', 'address': 'Avengers Team Building, USA'}

 

8-5. 원하는 쿼리를 통해 결과를 필터링하고 출력해보기

from pymongo import MongoClient

my_client = MongoClient("mongodb://localhost:27017/")

mydb = my_client['test']
mycol = mydb['customers']

my_query = {"address":"Seoul, Korea"}

my_doc = mycol.find(my_query)

for x in my_doc:
    print(x)

주소가 Seoul, Korea 인 Document만 필터링하여 출력해보았습니다.

다음과 같이 Seoul, Korea가 주소인 문서만 선택되어 출력이 된 것을 볼 수 있습니다.

(venv) (base) DongHyunui-MacBook-Pro:MovieFlaskAPI donghyunjang$ python AddDataToMongoDBFromCSV.py 
{'_id': ObjectId('5e8087fb2c7b4e51af20f836'), 'name': 'donghyunjang', 'address': 'Seoul, Korea'}

만약 쿼리에 넣은 주소가 문서들에 존재하지 않는다면

다음과 같이 결과에는 아무것도 출력되지 않는 것을 확인할 수 있습니다.

(venv) (base) DongHyunui-MacBook-Pro:MovieFlaskAPI donghyunjang$ python AddDataToMongoDBFromCSV.py 

 

8-6. 비교연산 쿼리를 통해 필터링하고 출력해보기

from pymongo import MongoClient

my_client = MongoClient("mongodb://localhost:27017/")

mydb = my_client['test']
mycol = mydb['customers']

my_query = {"name":{"$gt":"C"}}
my_doc = mycol.find(my_query)
for x in my_doc:
    print(x)

쿼리안에 이름이 " C " 보다 사전 순서 기준으로 더 뒤에있는 이름을 가지고 있는 문서들만 찾아 출력해보았습니다.

(venv) (base) DongHyunui-MacBook-Pro:MovieFlaskAPI donghyunjang$ python AddDataToMongoDBFromCSV.py 
{'_id': ObjectId('5e80876d143a7c2183ac3d93'), 'name': 'SOMJANG', 'address': 'Dongjakgu, Seoul'}
{'_id': ObjectId('5e8087fb2c7b4e51af20f835'), 'name': 'PUTTY', 'address': 'SSH World, Network'}
{'_id': ObjectId('5e8087fb2c7b4e51af20f836'), 'name': 'donghyunjang', 'address': 'Seoul, Korea'}

 

8-7. 정규식 쿼리를 통해 필터링하고 출력해보기

from pymongo import MongoClient

my_client = MongoClient("mongodb://localhost:27017/")

mydb = my_client['test']
mycol = mydb['customers']

my_query = {"name":{"$regex":"^A"}}
my_doc = mycol.find(my_query)

for x in my_doc:
    print(x)

쿼리안에 이름이 A로 시작하는 문서만 찾아 출력해보도록 해보았습니다.

(venv) (base) DongHyunui-MacBook-Pro:MovieFlaskAPI donghyunjang$ python AddDataToMongoDBFromCSV.py 
{'_id': ObjectId('5e8087fb2c7b4e51af20f837'), 'name': 'Avengers', 'address': 'Avengers Team Building, USA'}
Comments