DB/MongoDB

[MongoDB] MongoDB 및 Pymongo 설치 및 듀토리얼(Feat MacOS)

easysheep 2023. 9. 1. 15:51

1. 설치 컴퓨터 사양

모델명: iMac

칩: Apple M1

총 코어 개수: 8(4 성능 및 4 효율)

메모리: 16 GB

2. MongoDB 설치

# homebrew 미설치시 설치
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

#MongoDB를 설치 가능하게끔 Homebrew 추가해준다
brew tap mongodb/brew

# homebrew update
brew update

#MongoDB v7.0 설치 @부분은 안적어 주어도 설치 된다.
brew install mongodb-community@7.0

2. MongoDB실행

# MongoDB 시작
brew services start mongodb-community@7.0

# MongoDB 종료
brew services stop mongodb-community@7.0

# background process로 수동으로 실행
## Intel 칩
mongod --config /usr/local/etc/mongod.conf --fork

## apple silicon 칩
mongod --config /opt/homebrew/etc/mongod.conf --fork


# MongoDB에 연결
mongosh

3. pymongo 설치

python3 -m pip install pymongo

4. pymongo tutorial

# pip install pymongo
import pymongo
from pprint import pprint

# MongoDB instance를 생성
from pymongo import MongoClient
# 로컬 호스트에 포트 27017을 쓰는 MongoDB 인스턴스 생성
client = MongoClient("localhost", 27017)
# URL format으로 해도 된다.
# client = MongoClient("mongodb://localhost:27017/")

# 하나의 MongoDB 인스턴스는 다수의 독립된 데이터를 지원할 수 있다.
# 위의 연결된 MongoDB 인스턴스를 사용하여 Database에 연결하자
# client에 test_database의 이름을 가진 DB에 연결
db = client.test_database
# 이런 식으로 연결 할 수도 있다.
# db = client["test-database"]

### MogoDB에서 DB, collection은 매우 lazy하게 만들어진다
### 둘다 만든 후에 처음으로 document값이 들어가야 실제로 만들어 지기 시작한다..


# MogoDb에서 데이터는 Json스타일의 Document로 나타난다. 이를 Pymongo에서는 dict 형태로 나타낸다.
post = {
"name" : "Mike",
"text" : "Asdasdasd"
}

#insert_one 이라는 함수를 사용하여 데이터를 DB에 입력한다.
posts = db.posts
post_id = posts.insert_one(post).inserted_id
# document가 들어갈 때 _id 라는 키가 document에 있지 않으면 자동으로 documnet에 추가 된다.
post_id

결과 ObjectId('64f149a549fb6d9e72377434')

 

 

# collection에 값을 입력 했으므로 collection 이 생성된다.
db.list_collection_names()

['posts']

# MongoDB 에서의 가장 기본적인 쿼리인 find_one을 사용하여 하나의 document 찾기
# name 이 Mike인 documnet 하나를 반환
pprint(posts.find_one({"name":"Mike"}))

# name 이 Tom인 documnet 하나를 반환해야 하지만
# 해당 값이 존재 하지 않으므로 None 값을 반환
pprint(posts.find_one({"name":"Tom"}))

{'_id': ObjectId('64f1346449fb6d9e72377432'), 'name': 'Mike', 'text': 'Asdasdasd'}

None

# ObjectId로 검색하기 (_id값 검색하기)
pprint(posts.find_one({"_id":post_id}))
# 여기서 id의 값은 ObjectId 타입이다.
# 그러므로 해당 값을 문자열등 다른 타입으로 주면 찾지 못한다.
# from bson.objectid import ObjectId 해당 라이브러리를 이용하여 str값을 ObjectId로 바꾸어야한다.
pprint(posts.find_one({"_id":str(post_id)}))


from bson.objectid import ObjectId
ObjectId(str(post_id))

{'_id': ObjectId('64f149a549fb6d9e72377434'),

'name': 'Mike',

'text': 'Asdasdasd'}

# insert_many 를 사용하여 많은 값을 한번에 넣을 수 있다.
import datetime
# Document 배열
new_posts = [
{
"author": "Mike",
"text": "Another post!",
"tags": ["bulk", "insert"],
"date": datetime.datetime(2009, 11, 12, 11, 14),
},
{
"author": "Eliot",
"title": "MongoDB is fun",
"text": "and pretty easy too!",
"date": datetime.datetime(2009, 11, 10, 10, 45),
},
]
# Document(dict)로 이루어진 배열을 Collection 에 넣어준다.
result = posts.insert_many(new_posts)
# 다음과 같이 2개의 데이터가 추가 된것을 알 수 가 있다.
result.inserted_ids

[ObjectId('64f1648949fb6d9e72377435'), ObjectId('64f1648949fb6d9e72377436')]

# "$lt"를 이용한 범위 지정 쿼리
# lt 는 해당 값보다 작은 값을 찾아준다.
d = datetime.datetime(2009, 11, 11, 12)
# 전체 데이터 중 date기 2009년 11월 11시 12분 보다 일찍인 시간을 가진 데이터를 찾아서 출력한다.
for post in posts.find({"date": {"$lt": d}}).sort("author"):
pprint(post)

{'_id': ObjectId('64f1648949fb6d9e72377436'),

'author': 'Eliot',

'date': datetime.datetime(2009, 11, 10, 10, 45),

'text': 'and pretty easy too!',

'title': 'MongoDB is fun'}

 

5. 참고