Pymongo tutorial (파이몽고 사용하기) / pymongo 번역

조영규의 블로그

2014. 10. 29. 02:12 from Develop


Edit

Pymongo tutorial (파이몽고 사용하기)

파이 몽고란 파이썬 몽고 디비 드라이버이다. 버전 2.7.2 기준으로 작성되었다.

소프트웨어 마에스트로 프로젝트를 하면서 사용자의 로그를 빠르게 수집해 그것을 처리하기 위해 선택한 디비가 바로 몽고디비다. 이를 컨트롤 하기 위해서는 파이썬 백엔드 언어로 사용하기에 파이썬 몽고 디비 드라이버가 필요했다. 딱 구글신께 물어보니 파이몽고를 알려주사, 튜토리얼을 따라해보기로 했다.

하는 김에 번역도 해봤다. DogFoot번역이므로 필요하면 여기서 원문을 볼 수 있다. 그래도 번역가처럼 이해하기 좋게 의역도 해놔서 보기는 좋을 듯.

Tutorial

이 튜토리얼에서 몽고디비와 파이몽고의 작동에 대해 배울 수 있을 것이다.

준비물.

먼저 시작하기전에 파이몽고를 깔아야하지 않겠습니까. 파이썬 쉘을 열고 아래의 명령어를 쳐서 Exception이 발생하지 않는지 확인하자.

import pymongo

이 튜토리얼은 몽고디비 인스턴스가 디폴트 포트와 호스트에서 돌아감을 가정하고 진행한다. 몽고디비는 당연히 준비됐겠지? 몽고디비를 실행하라.

$ mongod

MongoClient를 가지고 몽고디비에 연결해보자.

첫번째 스탭은 파이몽고의 MongoClient를 돌고있는 mongod 인스턴스를 위해 만들어주는 것이다. 아래를 따라해라.

from pymongo import MongoClient
client = MongoClient()

위 코드는 디폴트 호스트와 포트에 연결 할 것이다. 만약에 디폴트 설정이 아니거나 명시적으로 표시해주고 싶다면 아래를 참고할 것.

client = MongoClient('localhost', 27017)

혹은 몽고디비 URI 포멧을 이용하여 적을 수도 있다!

client = MongoClient('mongodb://localhost:27017/')

데이터베이스 얻어오기.

몽고디비의 한 인스턴스는 독립적인 데이터베이스를 여러개 만들 수 있도록 해준다. 따라서 그중 어떤 데이터베이스를 가져올지는 아래를 따라해라. MongoClient 인스턴스를 이용해서.

db = client.test_database

test_database에 넣고 싶은걸 넣어라. 설마 저걸 따라치면 안된다.
만약 데이터베이스 이름이 저런식으로 표현이 안된다면 아래처럼도 가능하다.

db = client["test_database"]

컬렉션 가져오기.

컬렉션은 도큐먼트의 그룹이다. RDB의 데이터베이스와 얼추 비슷하게 생각하면 된다. 파이몽고로 컬렉션을 가져오는 방법은 아래와 같다.

collection = db.test_collection

당연하다. test_collection이라 넣으면 안된다. 넣고싶은걸 넣어라.
혹은 위에 데이터베이스에서 가져왔듯이 아래처럼도 가능하다.

collection = db["test_collection"]

몽고디비의 컬렉션이나 데이터베이스에서 중요한 것은 게으르게 생성된다는 것이다. (필요할 때가 되서야 억지로 생성된다는 것!) 위의 명령중 어느것도 몽고디비와 실제로 어떤 일도 수행하지 않는다. 컬렉션과 데이터베이스들은 첫 도큐먼트가 걔네들에 insert될 때 생성된다.

도큐먼트(문서)

몽고디비 안에 데이터는 JSON스타일로 저장된다. 파이 몽고는 파이썬의 딕셔너리를 활용해서 표현한다. 아래 예시처럼 말이다. 블로그 포스트를 의미하는 예시다.

import datetime
post = {
    "author" : "Mike",
    "text" : "My first blog post!",
    "tags" : ["mongodb", "python", "pymongo"],
    "date": datetime.datetime.utcnow()
}

기억하라. 도큐먼트(문서)는 네이티브 파이썬 타입(위의 datetime.datetime 인스턴스 같은)을 가지고 있을 수 있다. 이것은 자동적으로 BSON 타입으로 컨버팅되고, 또 컨버팅해서 가져온다.

도큐먼트에 Insert를 해보자.

도큐먼트에 insert를 하기 위해서 우리는 insert()란 메소드를 쓸거다.

posts = db.posts
post_id = posts.insert(post)

매우 간단하다. 만약 도큐먼트가 _id키를 가지고 있지 않다면 몽고디비가 알아서 도큐먼트에 특별한 _id 키를 부여해서 자동으로 인서트 된다. _id는 무조건 유니크해야한다. insert 메소드는 insert시 특별히 부여된 _id를 반환한다. 더 많은 정보가 필요하다면 몽고디비 사이트의 _id를 보라.

이게 처음 넣은 것이므로 그제서야 posts컬렉션이 실제로 몽고디비서버에 생성된다. 우리는 이제서야 우리 database에 posts 컬렉션이 리스트에 있음을 확인 할 수 있다.

>>> db.collection_names()
[u'system.indexes', u'posts']

system.indexes 컬렉션은 스페셜한 내부 컬렉션으로 자동으로 생성된다.

find_one()으로 한 도큐먼트 얻어오기.

가장 기본적인 타입의 몽고디비 쿼리가 바로 find_one()이다. 이 메소드는 쿼리가 매칭되는 하나의 도큐먼트(문서)를 가져오는 애다.
(mysql-connector를 파이썬에서 써봤다면 select_one()과 비슷한 애.)
만약 매치되는게 없다면 None 을 반환한다.

이것은 매우 유용한데 네가 만약 처음 매칭되는 도큐먼트나, 그 쿼리와 딱 맞게 하나만 존재하는 도큐먼트를 들고오고 싶을 때 정말 딱이다. 여기는 find_one()으로 posts컬렉션의 첫번째 도큐먼트를 들고오는 예제다.

>>> posts.find_one()
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

이 결과는 파이썬 딕셔너리로 반환된다.
리턴되는 도큐먼트에는 자동적으로 insert시 부여된 _id값이 같이 딸려온다.

find_one()은 특정 성분(앨리먼트)의 매칭 쿼리도 지원한다. 아래는 "Mike"가 author인 거 들고오는 예제다.

>>> posts.find_one({"author": "Mike"})
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

만약 없는 author를 시도한다면 아무 결과물도 안나올 것이다.

>>> posts.find_one({"author": "Eliot"})
>>>

ObjectId로 쿼리하기.

우리는 _id로도 쿼리할 수 있다.

>>> post_id
ObjectId(...)
>>> posts.find_one({"_id": post_id})
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

ObjectId오브젝트 아이디는 string이 아니다.
만약 아래와 같이 쿼리하면 아무것도 안나온다.

>>> post_id_as_str = str(post_id)
>>> posts.find_one({"_id": post_id_as_str}) # No result
>>>

웹 애플리케이션에서 가장 많이 하는 작업은 아마 ObjectId을 요청 URL을 가지고 받아와 매칭되는 도큐먼트를 찾는 일일 것이다. 이때는 ObjectId로 string을 바꿔서 find_one()에 줘야 한다.

from bson.objectid import ObjectId

# 웹 프레임워크로부터 post_id 받아오기. 이건 string일 것.
def get(post_id):
    # string을 ObjectId로 바꾸기.
    document = client.db.collection.find_one({'_id': ObjectId(post_id)})

참고 : When I query for a document by ObjectId in my web application I get no result

유니코드 String에서 주의할 점.

파이썬 string을 우리가 저장할 때 다른 형태로 저장된다는 걸 너는 아마 눈치 챘을 것이다. u'Mike'같이 원래'Mike'였던 애를 이상한 기호를 붙여 저장 하는 것 같이 말이다. 꺼내 올 때도 그렇게 보일 것이다. 여기서 짧게 설명 좀 하고 가야겠다.

몽고디비에 저장된 데이터는 BSON 포멧이다. 이 포멧의 string은 UTF-8로 인코딩되어 있는데, 파이몽고가 유효한 UTF-8 데이터만을 담아서 전달해 준것이다. 물론 이 과정에서 원래의 string(<type 'str'>)의 정보는 전혀 바뀌지 않는다. 유니코드(<type ‘unicode’>)는 UTF-8로 우선 인코딩된다. 우리의 예제의 string들이 u가 앞에 붙은 형태로 string이 나타나는 것은 pyMongo가 BSON string을 파이썬의 unicode로 바꿔 보여주기 때문이다. 'Mike'와 같은 일반적인 string이 아니라!

더 궁금한 사항은 여기를 참고하라.

통째로 insert하기.

몇개의 도큐먼트를 동시에 인서트해보자. 우리는 bulk insert operations를 하나의 도큐먼트를 넣는 것 처럼 할 수 있다. insert()에 첫번째 인자로 iterable을 넣기만 하면 준비 끝! 이것은 각 도큐먼트를 돌며 알아서 insert해 줄 것이다. 하나의 명령으로 말이다.

>>> 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)}]
>>> posts.insert(new_posts)
[ObjectId('...'), ObjectId('...')]

이 예제에 관한 흥미로운 사실 2개가 있다.

  • insert()를 여기서 부르면 2개의 들어간 각각의 ObjectId가 반환된다.
  • news_posts[1]은 모양이 조금 다른데, tag가 아닌 title을 가지고 있다. 이게 바로 몽고디비에서 맨날 말하는 그 '스키마가 없다'다!

한 도큐먼트 이상에게 쿼리 던지기

find()함수를 통하면 한개의 도큐먼트 이상을 위한 쿼리를 던질 수 있다. find()Cuser Instance를 반환하는데, 이것은 도큐먼트들을 순회(iterate)할 수 있도록 해준다. 예를들어 아래처럼 우리는 posts 컬렉션을 싹 순회할 수 있다. (iterate 할 수 있다.)

>>> for post in posts.find():
...   post
...
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}

find_one()처럼 우리는 find()를 통해 결과에 필터(제한)을 걸 수 있다. 예를 들어 MIKE라는 author를 꺼내보자.

>>> for post in posts.find({"author": "Mike"}):
...   post
...
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}

갯수 세기.

만약에 쿼리에 매칭되는 도큐먼트의 갯수만 궁금하다면, 너는 count()를 사용해서 긴 쿼리를 통하지 않고도 알아 낼 수 있다.

>>> posts.count()
3

혹은 상세 쿼리를 던져서도 알아낼 수 있다.

>>> posts.find({"author": "Mike"}).count()
2

다양한 쿼리를 쓸 수 있다.

몽고디비는 다양한 향상된 쿼리를 제공한다. 해당 날짜 이후의 도큐먼트들을 날짜 순으로 정렬하고 그걸 또 author순으로도 정렬하는 예를 보라.

>>> d = datetime.datetime(2009, 11, 12, 12)
>>> for post in posts.find({"date": {"$lt": d}}).sort("author"):
...   print post
...
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}

여기서 우리가 사용한 &lt 연산자가 쿼리의 범위를 제한하고 그걸 sort()author에 따라 순서대로 정렬했다.

인덱싱

쿼리를 더 빠르게 실행시키기 위해 우리는 indexdateauthor에 대해 생성할 수 있다. 그러기위해 먼저 explain() 메소드를 사용해서 몇가지 정보를 얻어보자. index없이 어느정도의 퍼포먼스가 나오는지 알 수 있다.

>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
u'BasicCursor'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]
3

이걸 보면 BasicCursor가 쿼리를 처리하고 있고, 걔가 컬렉션에 있는 3개의 도큐먼트를 쿼리를 처리하기 위해 스캐닝 했다는 점을 알 수 있다.
이제 index를 걸어보자.

>>> from pymongo import ASCENDING, DESCENDING
>>> posts.create_index([("date", DESCENDING), ("author", ASCENDING)])
u'date_-1_author_1'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
u'BtreeCursor date_-1_author_1'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]
2

이제 쿼리를 BtreeCursor (인덱스)를 처리하고, 오직 두개의 도큐먼트만이 스캐닝 되었다는 사실을 알 수 있다.

%23Pymongo%20tutorial%20%28%uD30C%uC774%uBABD%uACE0%20%uC0AC%uC6A9%uD558%uAE30%29%0A%0A*%uD30C%uC774%20%uBABD%uACE0%uB780%20%uD30C%uC774%uC36C%20%uBABD%uACE0%20%uB514%uBE44%20%uB4DC%uB77C%uC774%uBC84%uC774%uB2E4.%20%uBC84%uC804%202.7.2%20%uAE30%uC900%uC73C%uB85C%20%uC791%uC131%uB418%uC5C8%uB2E4.*%0A%0A%uC18C%uD504%uD2B8%uC6E8%uC5B4%20%uB9C8%uC5D0%uC2A4%uD2B8%uB85C%20%uD504%uB85C%uC81D%uD2B8%uB97C%20%uD558%uBA74%uC11C%20%uC0AC%uC6A9%uC790%uC758%20%uB85C%uADF8%uB97C%20%uBE60%uB974%uAC8C%20%uC218%uC9D1%uD558%uACE0%20%uCC98%uB9AC%uD558%uAE30%20%uC704%uD574%20%uC120%uD0DD%uD55C%20%uB514%uBE44%uAC00%20%uBC14%uB85C%20%uBABD%uACE0%uB514%uBE44%uB2E4.%20%uC774%uB97C%20%uCEE8%uD2B8%uB864%20%uD558%uAE30%20%uC704%uD574%uC11C%uB294%20%uD30C%uC774%uC36C%20%uBC31%uC5D4%uB4DC%20%uC5B8%uC5B4%uB85C%20%uC0AC%uC6A9%uD558%uAE30%uC5D0%20%uD30C%uC774%uC36C%20%uBABD%uACE0%20%uB514%uBE44%20%uB4DC%uB77C%uC774%uBC84%uAC00%20%uD544%uC694%uD588%uB2E4.%20%uB531%20%uAD6C%uAE00%uC2E0%uAED8%20%uBB3C%uC5B4%uBCF4%uB2C8%20%uD30C%uC774%uBABD%uACE0%uB97C%20%uC54C%uB824%uC8FC%uC0AC%2C%20%uD29C%uD1A0%uB9AC%uC5BC%uC744%20%uB530%uB77C%uD574%uBCF4%uAE30%uB85C%20%uD588%uB2E4.%0A%0A%uD558%uB294%20%uAE40%uC5D0%20%uBC88%uC5ED%uB3C4%20%uD574%uBD24%uB2E4.%20DogFoot%uBC88%uC5ED%uC774%uBBC0%uB85C%20%uD544%uC694%uD558%uBA74%20%5B%uC5EC%uAE30%5D%28http%3A//api.mongodb.org/python/current/tutorial.html%29%uC11C%20%uC6D0%uBB38%uC744%20%uBCFC%20%uC218%20%uC788%uB2E4.%20%uADF8%uB798%uB3C4%20%uBC88%uC5ED%uAC00%uCC98%uB7FC%20%uC774%uD574%uD558%uAE30%20%uC88B%uAC8C%20%uC758%uC5ED%uB3C4%20%uD574%uB194%uC11C%20%uBCF4%uAE30%uB294%20%uC88B%uC744%20%uB4EF.%0A%0A%23%23Tutorial%0A%uC774%20%uD29C%uD1A0%uB9AC%uC5BC%uC5D0%uC11C%20%uBABD%uACE0%uB514%uBE44%uC640%20%uD30C%uC774%uBABD%uACE0%uC758%20%uC791%uB3D9%uC5D0%20%uB300%uD574%20%uBC30%uC6B8%20%uC218%20%uC788%uC744%20%uAC83%uC774%uB2E4.%0A%0A%23%23%uC900%uBE44%uBB3C.%0A%uBA3C%uC800%20%uC2DC%uC791%uD558%uAE30%uC804%uC5D0%20%uD30C%uC774%uBABD%uACE0%uB97C%20%uAE54%uC544%uC57C%uD558%uC9C0%20%uC54A%uACA0%uC2B5%uB2C8%uAE4C.%20%uD30C%uC774%uC36C%20%uC258%uC744%20%uC5F4%uACE0%20%uC544%uB798%uC758%20%uBA85%uB839%uC5B4%uB97C%20%uCCD0%uC11C%20%60Exception%60%uC774%20%uBC1C%uC0DD%uD558%uC9C0%20%uC54A%uB294%uC9C0%20%uD655%uC778%uD558%uC790.%0A%0A%20%20%20%20import%20pymongo%0A%0A%uC774%20%uD29C%uD1A0%uB9AC%uC5BC%uC740%20%uBABD%uACE0%uB514%uBE44%20%uC778%uC2A4%uD134%uC2A4%uAC00%20**%uB514%uD3F4%uD2B8%20%uD3EC%uD2B8%uC640%20%uD638%uC2A4%uD2B8**%uC5D0%uC11C%20%uB3CC%uC544%uAC10%uC744%20%uAC00%uC815%uD558%uACE0%20%uC9C4%uD589%uD55C%uB2E4.%20%uBABD%uACE0%uB514%uBE44%uB294%20%uB2F9%uC5F0%uD788%20%uC900%uBE44%uB410%uACA0%uC9C0%3F%20%uBABD%uACE0%uB514%uBE44%uB97C%20%uC2E4%uD589%uD558%uB77C.%0A%0A%20%20%20%20%24%20mongod%0A%0A%23%23MongoClient%uB97C%20%uAC00%uC9C0%uACE0%20%uBABD%uACE0%uB514%uBE44%uC5D0%20%uC5F0%uACB0%uD574%uBCF4%uC790.%0A%0A%uCCAB%uBC88%uC9F8%20%uC2A4%uD0ED%uC740%20%uD30C%uC774%uBABD%uACE0%uC758%20%60MongoClient%60%uB97C%20%uB3CC%uACE0%uC788%uB294%20mongod%20%uC778%uC2A4%uD134%uC2A4%uB97C%20%uC704%uD574%20%uB9CC%uB4E4%uC5B4%uC8FC%uB294%20%uAC83%uC774%uB2E4.%20%uC544%uB798%uB97C%20%uB530%uB77C%uD574%uB77C.%0A%0A%20%20%20%20from%20pymongo%20import%20MongoCleint%0A%20%20%20%20client%20%3D%20MongoClient%28%29%0A%20%20%20%20%0A%uC704%20%uCF54%uB4DC%uB294%20%uB514%uD3F4%uD2B8%20%uD638%uC2A4%uD2B8%uC640%20%uD3EC%uD2B8%uC5D0%20%uC5F0%uACB0%20%uD560%20%uAC83%uC774%uB2E4.%20%uB9CC%uC57D%uC5D0%20%uB514%uD3F4%uD2B8%20%uC124%uC815%uC774%20%uC544%uB2C8%uAC70%uB098%20%uBA85%uC2DC%uC801%uC73C%uB85C%20%uD45C%uC2DC%uD574%uC8FC%uACE0%20%uC2F6%uB2E4%uBA74%20%uC544%uB798%uB97C%20%uCC38%uACE0%uD560%20%uAC83.%0A%0A%20%20%20%20client%20%3D%20MongoClient%28%27localhost%27%2C%2027017%29%0A%20%20%20%20%0A%uD639%uC740%20%uBABD%uACE0%uB514%uBE44%20URI%20%uD3EC%uBA67%uC744%20%uC774%uC6A9%uD558%uC5EC%20%uC801%uC744%20%uC218%uB3C4%20%uC788%uB2E4%21%0A%0A%20%20%20%20client%20%3D%20MongoClient%28%27mongodb%3A//localhost%3A27017/%27%29%0A%20%20%20%20%0A%23%23%uB370%uC774%uD130%uBCA0%uC774%uC2A4%20%uC5BB%uC5B4%uC624%uAE30.%0A%0A%uBABD%uACE0%uB514%uBE44%uC758%20%uD55C%20%uC778%uC2A4%uD134%uC2A4%uB294%20%uB3C5%uB9BD%uC801%uC778%20%uB370%uC774%uD130%uBCA0%uC774%uC2A4%uB97C%20%uC5EC%uB7EC%uAC1C%20%uB9CC%uB4E4%20%uC218%20%uC788%uB3C4%uB85D%20%uD574%uC900%uB2E4.%20%uB530%uB77C%uC11C%20%uADF8%uC911%20%uC5B4%uB5A4%20%uB370%uC774%uD130%uBCA0%uC774%uC2A4%uB97C%20%uAC00%uC838%uC62C%uC9C0%uB294%20%uC544%uB798%uB97C%20%uB530%uB77C%uD574%uB77C.%20%60MongoClient%60%20%uC778%uC2A4%uD134%uC2A4%uB97C%20%uC774%uC6A9%uD574%uC11C.%0A%0A%20%20%20%20db%20%3D%20client.test_database%0A%20%20%20%20%0Atest_database%uC5D0%20%uB123%uACE0%20%uC2F6%uC740%uAC78%20%uB123%uC5B4%uB77C.%20%uC124%uB9C8%20%uC800%uAC78%20%uB530%uB77C%uCE58%uBA74%20%uC548%uB41C%uB2E4.%0A%uB9CC%uC57D%20%uB370%uC774%uD130%uBCA0%uC774%uC2A4%20%uC774%uB984%uC774%20%uC800%uB7F0%uC2DD%uC73C%uB85C%20%uD45C%uD604%uC774%20%uC548%uB41C%uB2E4%uBA74%20%uC544%uB798%uCC98%uB7FC%uB3C4%20%uAC00%uB2A5%uD558%uB2E4.%0A%0A%20%20%20%20db%20%3D%20client%5B%22test_database%22%5D%0A%0A%23%23%uCEEC%uB809%uC158%20%uAC00%uC838%uC624%uAE30.%0A%0A%uCEEC%uB809%uC158%uC740%20%uB3C4%uD050%uBA3C%uD2B8%uC758%20%uADF8%uB8F9%uC774%uB2E4.%20RDB%uC758%20%uB370%uC774%uD130%uBCA0%uC774%uC2A4%uC640%20%uC5BC%uCD94%20%uBE44%uC2B7%uD558%uAC8C%20%uC0DD%uAC01%uD558%uBA74%20%uB41C%uB2E4.%20%uD30C%uC774%uBABD%uACE0%uB85C%20%uCEEC%uB809%uC158%uC744%20%uAC00%uC838%uC624%uB294%20%uBC29%uBC95%uC740%20%uC544%uB798%uC640%20%uAC19%uB2E4.%0A%0A%20%20%20%20collection%20%3D%20db.test_collection%0A%20%20%20%20%0A%uB2F9%uC5F0%uD558%uB2E4.%20test_collection%uC774%uB77C%20%uB123%uC73C%uBA74%20%uC548%uB41C%uB2E4.%20%uB123%uACE0%uC2F6%uC740%uAC78%20%uB123%uC5B4%uB77C.%0A%uD639%uC740%20%uC704%uC5D0%20%uB370%uC774%uD130%uBCA0%uC774%uC2A4%uC5D0%uC11C%20%uAC00%uC838%uC654%uB4EF%uC774%20%uC544%uB798%uCC98%uB7FC%uB3C4%20%uAC00%uB2A5%uD558%uB2E4.%0A%0A%20%20%20%20collection%20%3D%20db%5B%22test_collection%22%5D%0A%0A%uBABD%uACE0%uB514%uBE44%uC758%20%uCEEC%uB809%uC158%uC774%uB098%20%uB370%uC774%uD130%uBCA0%uC774%uC2A4%uC5D0%uC11C%20%uC911%uC694%uD55C%20%uAC83%uC740%20%uAC8C%uC73C%uB974%uAC8C%20%uC0DD%uC131%uB41C%uB2E4%uB294%20%uAC83%uC774%uB2E4.%20%28%uD544%uC694%uD560%20%uB54C%uAC00%20%uB418%uC11C%uC57C%20%uC5B5%uC9C0%uB85C%20%uC0DD%uC131%uB41C%uB2E4%uB294%20%uAC83%21%29%20%uC704%uC758%20%uBA85%uB839%uC911%20%uC5B4%uB290%uAC83%uB3C4%20%uBABD%uACE0%uB514%uBE44%uC640%20%uC2E4%uC81C%uB85C%20%uC5B4%uB5A4%20%uC77C%uB3C4%20%uC218%uD589%uD558%uC9C0%20%uC54A%uB294%uB2E4.%20%uCEEC%uB809%uC158%uACFC%20%uB370%uC774%uD130%uBCA0%uC774%uC2A4%uB4E4%uC740%20%uCCAB%20%uB3C4%uD050%uBA3C%uD2B8%uAC00%20%uAC54%uB124%uB4E4%uC5D0%20insert%uB420%20%uB54C%20%uC0DD%uC131%uB41C%uB2E4.%0A%0A%23%23%uB3C4%uD050%uBA3C%uD2B8%28%uBB38%uC11C%29%0A%0A%uBABD%uACE0%uB514%uBE44%20%uC548%uC5D0%20%uB370%uC774%uD130%uB294%20JSON%uC2A4%uD0C0%uC77C%uB85C%20%uC800%uC7A5%uB41C%uB2E4.%20%uD30C%uC774%20%uBABD%uACE0%uB294%20%uD30C%uC774%uC36C%uC758%20%uB515%uC154%uB108%uB9AC%uB97C%20%uD65C%uC6A9%uD574%uC11C%20%uD45C%uD604%uD55C%uB2E4.%20%uC544%uB798%20%uC608%uC2DC%uCC98%uB7FC%20%uB9D0%uC774%uB2E4.%20%uBE14%uB85C%uADF8%20%uD3EC%uC2A4%uD2B8%uB97C%20%uC758%uBBF8%uD558%uB294%20%uC608%uC2DC%uB2E4.%0A%0A%20%20%20%20import%20datetime%0A%20%20%20%20post%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22author%22%20%3A%20%22Mike%22%2C%0A%20%20%20%20%20%20%20%20%22text%22%20%3A%20%22My%20first%20blog%20post%21%22%2C%0A%20%20%20%20%20%20%20%20%22tags%22%20%3A%20%5B%22mongodb%22%2C%20%22python%22%2C%20%22pymongo%22%5D%2C%0A%20%20%20%20%20%20%20%20%22date%22%3A%20datetime.datetime.utcnow%28%29%0A%20%20%20%20%7D%0A%20%20%20%20%0A%uAE30%uC5B5%uD558%uB77C.%20%uB3C4%uD050%uBA3C%uD2B8%28%uBB38%uC11C%29%uB294%20%uB124%uC774%uD2F0%uBE0C%20%uD30C%uC774%uC36C%20%uD0C0%uC785%28%uC704%uC758%20%60datetime.datetime%60%20%uC778%uC2A4%uD134%uC2A4%20%uAC19%uC740%29%uC744%20%uAC00%uC9C0%uACE0%20%uC788%uC744%20%uC218%20%uC788%uB2E4.%20%uC774%uAC83%uC740%20%uC790%uB3D9%uC801%uC73C%uB85C%20BSON%20%uD0C0%uC785%uC73C%uB85C%20%uCEE8%uBC84%uD305%uB418%uACE0%2C%20%uB610%20%uCEE8%uBC84%uD305%uD574%uC11C%20%uAC00%uC838%uC628%uB2E4.%0A%0A%23%23%uB3C4%uD050%uBA3C%uD2B8%uC5D0%20Insert%uB97C%20%uD574%uBCF4%uC790.%0A%uB3C4%uD050%uBA3C%uD2B8%uC5D0%20insert%uB97C%20%uD558%uAE30%20%uC704%uD574%uC11C%20%uC6B0%uB9AC%uB294%20%60insert%28%29%60%uB780%20%uBA54%uC18C%uB4DC%uB97C%20%uC4F8%uAC70%uB2E4.%0A%20%20%20%20%0A%20%20%20%20posts%20%3D%20db.posts%0A%20%20%20%20post_id%20%3D%20posts.insert%28post%29%0A%20%20%20%20%0A%uB9E4%uC6B0%20%uAC04%uB2E8%uD558%uB2E4.%20%uB9CC%uC57D%20%uB3C4%uD050%uBA3C%uD2B8%uAC00%20_id%uD0A4%uB97C%20%uAC00%uC9C0%uACE0%20%uC788%uC9C0%20%uC54A%uB2E4%uBA74%20%uBABD%uACE0%uB514%uBE44%uAC00%20%uC54C%uC544%uC11C%20%uB3C4%uD050%uBA3C%uD2B8%uC5D0%20%uD2B9%uBCC4%uD55C%20_id%20%uD0A4%uB97C%20%uBD80%uC5EC%uD574%uC11C%20%uC790%uB3D9%uC73C%uB85C%20%uC778%uC11C%uD2B8%20%uB41C%uB2E4.%20_id%uB294%20%uBB34%uC870%uAC74%20%uC720%uB2C8%uD06C%uD574%uC57C%uD55C%uB2E4.%20insert%20%uBA54%uC18C%uB4DC%uB294%20insert%uC2DC%20%uD2B9%uBCC4%uD788%20%uBD80%uC5EC%uB41C%20_id%uB97C%20%uBC18%uD658%uD55C%uB2E4.%20%uB354%20%uB9CE%uC740%20%uC815%uBCF4%uAC00%20%uD544%uC694%uD558%uB2E4%uBA74%20%5B%uBABD%uACE0%uB514%uBE44%20%uC0AC%uC774%uD2B8%uC758%20_id%5D%28http%3A//docs.mongodb.org/manual/reference/object-id/%29%uB97C%20%uBCF4%uB77C.%0A%0A%uC774%uAC8C%20%uCC98%uC74C%20%uB123%uC740%20%uAC83%uC774%uBBC0%uB85C%20%uADF8%uC81C%uC11C%uC57C%20*posts*%uCEEC%uB809%uC158%uC774%20%uC2E4%uC81C%uB85C%20%uBABD%uACE0%uB514%uBE44%uC11C%uBC84%uC5D0%20%uC0DD%uC131%uB41C%uB2E4.%20%uC6B0%uB9AC%uB294%20%uC774%uC81C%uC11C%uC57C%20%uC6B0%uB9AC%20database%uC5D0%20*posts*%20%uCEEC%uB809%uC158%uC774%20%uB9AC%uC2A4%uD2B8%uC5D0%20%uC788%uC74C%uC744%20%uD655%uC778%20%uD560%20%uC218%20%uC788%uB2E4.%20%0A%0A%20%20%20%20%3E%3E%3E%20db.collection_names%28%29%0A%20%20%20%20%5Bu%27system.indexes%27%2C%20u%27posts%27%5D%0A%20%20%20%20%0A***system.indexes%20%uCEEC%uB809%uC158%uC740%20%uC2A4%uD398%uC15C%uD55C%20%uB0B4%uBD80%20%uCEEC%uB809%uC158%uC73C%uB85C%20%uC790%uB3D9%uC73C%uB85C%20%uC0DD%uC131%uB41C%uB2E4.***%0A%0A%23%23find_one%28%29%uC73C%uB85C%20%uD55C%20%uB3C4%uD050%uBA3C%uD2B8%20%uC5BB%uC5B4%uC624%uAE30.%0A%uAC00%uC7A5%20%uAE30%uBCF8%uC801%uC778%20%uD0C0%uC785%uC758%20%uBABD%uACE0%uB514%uBE44%20%uCFFC%uB9AC%uAC00%20%uBC14%uB85C%20%60find_one%28%29%60%uC774%uB2E4.%20%uC774%20%uBA54%uC18C%uB4DC%uB294%20%uCFFC%uB9AC%uAC00%20%uB9E4%uCE6D%uB418%uB294%20%uD558%uB098%uC758%20%uB3C4%uD050%uBA3C%uD2B8%28%uBB38%uC11C%29%uB97C%20%uAC00%uC838%uC624%uB294%20%uC560%uB2E4.%0A*%28mysql-connector%uB97C%20%uD30C%uC774%uC36C%uC5D0%uC11C%20%uC368%uBD24%uB2E4%uBA74%20select_one%28%29%uACFC%20%uBE44%uC2B7%uD55C%20%uC560.%29*%0A%uB9CC%uC57D%20%uB9E4%uCE58%uB418%uB294%uAC8C%20%uC5C6%uB2E4%uBA74%20%60None%60%20%uC744%20%uBC18%uD658%uD55C%uB2E4.%0A%0A%uC774%uAC83%uC740%20%uB9E4%uC6B0%20%uC720%uC6A9%uD55C%uB370%20%uB124%uAC00%20%uB9CC%uC57D%20%uCC98%uC74C%20%uB9E4%uCE6D%uB418%uB294%20%uB3C4%uD050%uBA3C%uD2B8%uB098%2C%20%uADF8%20%uCFFC%uB9AC%uC640%20%uB531%20%uB9DE%uAC8C%20%uD558%uB098%uB9CC%20%uC874%uC7AC%uD558%uB294%20%uB3C4%uD050%uBA3C%uD2B8%uB97C%20%uB4E4%uACE0%uC624%uACE0%20%uC2F6%uC744%20%uB54C%20%uC815%uB9D0%20%uB531%uC774%uB2E4.%20%uC5EC%uAE30%uB294%20%60find_one%28%29%60%uC73C%uB85C%20*posts*%uCEEC%uB809%uC158%uC758%20%uCCAB%uBC88%uC9F8%20%uB3C4%uD050%uBA3C%uD2B8%uB97C%20%uB4E4%uACE0%uC624%uB294%20%uC608%uC81C%uB2E4.%0A%0A%20%20%20%20%3E%3E%3E%20posts.find_one%28%29%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%28...%29%2C%20u%27text%27%3A%20u%27My%20first%20blog%20post%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Mike%27%2C%20u%27tags%27%3A%20%5Bu%27mongodb%27%2C%20u%27python%27%2C%20u%27pymongo%27%5D%7D%0A%20%20%20%20%0A%uC774%20%uACB0%uACFC%uB294%20%uD30C%uC774%uC36C%20%uB515%uC154%uB108%uB9AC%uB85C%20%uBC18%uD658%uB41C%uB2E4.%0A***%uB9AC%uD134%uB418%uB294%20%uB3C4%uD050%uBA3C%uD2B8%uC5D0%uB294%20%uC790%uB3D9%uC801%uC73C%uB85C%20insert%uC2DC%20%uBD80%uC5EC%uB41C%20_id%uAC12%uC774%20%uAC19%uC774%20%uB538%uB824%uC628%uB2E4.***%0A%0A%60find_one%28%29%60%uC740%20%uD2B9%uC815%20%uC131%uBD84%28%uC568%uB9AC%uBA3C%uD2B8%29%uC758%20%uB9E4%uCE6D%20%uCFFC%uB9AC%uB3C4%20%uC9C0%uC6D0%uD55C%uB2E4.%20%uC544%uB798%uB294%20%60%22Mike%22%60%uAC00%20author%uC778%20%uAC70%20%uB4E4%uACE0%uC624%uB294%20%uC608%uC81C%uB2E4.%0A%0A%20%20%20%20%3E%3E%3E%20posts.find_one%28%7B%22author%22%3A%20%22Mike%22%7D%29%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%28...%29%2C%20u%27text%27%3A%20u%27My%20first%20blog%20post%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Mike%27%2C%20u%27tags%27%3A%20%5Bu%27mongodb%27%2C%20u%27python%27%2C%20u%27pymongo%27%5D%7D%0A%20%20%20%20%0A%uB9CC%uC57D%20%uC5C6%uB294%20author%uB97C%20%uC2DC%uB3C4%uD55C%uB2E4%uBA74%20%uC544%uBB34%20%uACB0%uACFC%uBB3C%uB3C4%20%uC548%uB098%uC62C%20%uAC83%uC774%uB2E4.%0A%0A%20%20%20%20%3E%3E%3E%20posts.find_one%28%7B%22author%22%3A%20%22Eliot%22%7D%29%0A%20%20%20%20%3E%3E%3E%0A%0A%23%23ObjectId%uB85C%20%uCFFC%uB9AC%uD558%uAE30.%0A%uC6B0%uB9AC%uB294%20%60_id%60%uB85C%uB3C4%20%uCFFC%uB9AC%uD560%20%uC218%20%uC788%uB2E4.%20%0A%0A%20%20%20%20%3E%3E%3E%20post_id%0A%20%20%20%20ObjectId%28...%29%0A%20%20%20%20%3E%3E%3E%20posts.find_one%28%7B%22_id%22%3A%20post_id%7D%29%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%28...%29%2C%20u%27text%27%3A%20u%27My%20first%20blog%20post%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Mike%27%2C%20u%27tags%27%3A%20%5Bu%27mongodb%27%2C%20u%27python%27%2C%20u%27pymongo%27%5D%7D%0A%20%20%20%20%0A***ObjectId%uC624%uBE0C%uC81D%uD2B8%20%uC544%uC774%uB514%uB294%20string%uC774%20%uC544%uB2C8%uB2E4.***%20%0A%uB9CC%uC57D%20%uC544%uB798%uC640%20%uAC19%uC774%20%uCFFC%uB9AC%uD558%uBA74%20%uC544%uBB34%uAC83%uB3C4%20%uC548%uB098%uC628%uB2E4.%0A%0A%20%20%20%20%3E%3E%3E%20post_id_as_str%20%3D%20str%28post_id%29%0A%20%20%20%20%3E%3E%3E%20posts.find_one%28%7B%22_id%22%3A%20post_id_as_str%7D%29%20%23%20No%20result%0A%20%20%20%20%3E%3E%3E%0A%0A%uC6F9%20%uC560%uD50C%uB9AC%uCF00%uC774%uC158%uC5D0%uC11C%20%uAC00%uC7A5%20%uB9CE%uC774%20%uD558%uB294%20%uC791%uC5C5%uC740%20%uC544%uB9C8%20ObjectId%uC744%20%uC694%uCCAD%20URL%uC744%20%uAC00%uC9C0%uACE0%20%uBC1B%uC544%uC640%20%uB9E4%uCE6D%uB418%uB294%20%uB3C4%uD050%uBA3C%uD2B8%uB97C%20%uCC3E%uB294%20%uC77C%uC77C%20%uAC83%uC774%uB2E4.%20%uC774%uB54C%uB294%20ObjectId%uB85C%20string%uC744%20%uBC14%uAFD4%uC11C%20%60find_one%28%29%60%uC5D0%20%uC918%uC57C%20%uD55C%uB2E4.%0A%0A%20%20%20%20from%20bson.objectid%20import%20ObjectId%0A%0A%20%20%20%20%23%20%uC6F9%20%uD504%uB808%uC784%uC6CC%uD06C%uB85C%uBD80%uD130%20post_id%20%uBC1B%uC544%uC624%uAE30.%20%uC774%uAC74%20string%uC77C%20%uAC83.%0A%20%20%20%20def%20get%28post_id%29%3A%0A%20%20%20%20%20%20%20%20%23%20string%uC744%20ObjectId%uB85C%20%uBC14%uAFB8%uAE30.%0A%20%20%20%20%20%20%20%20document%20%3D%20client.db.collection.find_one%28%7B%27_id%27%3A%20ObjectId%28post_id%29%7D%29%0A%20%20%20%20%20%20%20%20%0A*%uCC38%uACE0*%20%3A%20%5BWhen%20I%20query%20for%20a%20document%20by%20ObjectId%20in%20my%20web%20application%20I%20get%20no%20result%5D%28http%3A//api.mongodb.org/python/current/faq.html%23web-application-querying-by-objectid%29%0A%0A%23%23%uC720%uB2C8%uCF54%uB4DC%20String%uC5D0%uC11C%20%uC8FC%uC758%uD560%20%uC810.%0A%uD30C%uC774%uC36C%20string%uC744%20%uC6B0%uB9AC%uAC00%20%uC800%uC7A5%uD560%20%uB54C%20%uB2E4%uB978%20%uD615%uD0DC%uB85C%20%uC800%uC7A5%uB41C%uB2E4%uB294%20%uAC78%20%uB108%uB294%20%uC544%uB9C8%20%uB208%uCE58%20%uCC58%uC744%20%uAC83%uC774%uB2E4.%20%60u%27Mike%27%60%uAC19%uC774%20%uC6D0%uB798%60%27Mike%27%60%uC600%uB358%20%uC560%uB97C%20%uC774%uC0C1%uD55C%20%uAE30%uD638%uB97C%20%uBD99%uC5EC%20%uC800%uC7A5%20%uD558%uB294%20%uAC83%20%uAC19%uC774%20%uB9D0%uC774%uB2E4.%20%uAEBC%uB0B4%20%uC62C%20%uB54C%uB3C4%20%uADF8%uB807%uAC8C%20%uBCF4%uC77C%20%uAC83%uC774%uB2E4.%20%uC5EC%uAE30%uC11C%20%uC9E7%uAC8C%20%uC124%uBA85%20%uC880%20%uD558%uACE0%20%uAC00%uC57C%uACA0%uB2E4.%0A%0A%uBABD%uACE0%uB514%uBE44%uC5D0%20%uC800%uC7A5%uB41C%20%uB370%uC774%uD130%uB294%20BSON%20%uD3EC%uBA67%uC774%uB2E4.%20%uC774%20%uD3EC%uBA67%uC758%20string%uC740%20UTF-8%uB85C%20%uC778%uCF54%uB529%uB418%uC5B4%20%uC788%uB294%uB370%2C%20%uD30C%uC774%uBABD%uACE0%uAC00%20%uC720%uD6A8%uD55C%20UTF-8%20%uB370%uC774%uD130%uB9CC%uC744%20%uB2F4%uC544%uC11C%20%uC804%uB2EC%uD574%20%uC900%uAC83%uC774%uB2E4.%20%uBB3C%uB860%20%uC774%20%uACFC%uC815%uC5D0%uC11C%20%uC6D0%uB798%uC758%20string%28%60%3Ctype%20%27str%27%3E%60%29%uC758%20%uC815%uBCF4%uB294%20%uC804%uD600%20%uBC14%uB00C%uC9C0%20%uC54A%uB294%uB2E4.%20%uC720%uB2C8%uCF54%uB4DC%28%60%3Ctype%20%u2018unicode%u2019%3E%60%29%uB294%20UTF-8%uB85C%20%uC6B0%uC120%20%uC778%uCF54%uB529%uB41C%uB2E4.%20%uC6B0%uB9AC%uC758%20%uC608%uC81C%uC758%20string%uB4E4%uC774%20u%uAC00%20%uC55E%uC5D0%20%uBD99%uC740%20%uD615%uD0DC%uB85C%20string%uC774%20%uB098%uD0C0%uB098%uB294%20%uAC83%uC740%20pyMongo%uAC00%20BSON%20string%uC744%20%uD30C%uC774%uC36C%uC758%20unicode%uB85C%20%uBC14%uAFD4%20%uBCF4%uC5EC%uC8FC%uAE30%20%uB54C%uBB38%uC774%uB2E4.%20%60%27Mike%27%60%uC640%20%uAC19%uC740%20%uC77C%uBC18%uC801%uC778%20string%uC774%20%uC544%uB2C8%uB77C%21%0A%0A%uB354%20%uAD81%uAE08%uD55C%20%uC0AC%uD56D%uC740%20%5B%uC5EC%uAE30%5D%28https%3A//docs.python.org/2/howto/unicode.html%29%uB97C%20%uCC38%uACE0%uD558%uB77C.%0A%0A%23%23%uD1B5%uC9F8%uB85C%20insert%uD558%uAE30.%0A%uBA87%uAC1C%uC758%20%uB3C4%uD050%uBA3C%uD2B8%uB97C%20%uB3D9%uC2DC%uC5D0%20%uC778%uC11C%uD2B8%uD574%uBCF4%uC790.%20%uC6B0%uB9AC%uB294%20*bulk%20insert%20operations*%uB97C%20%uD558%uB098%uC758%20%uB3C4%uD050%uBA3C%uD2B8%uB97C%20%uB123%uB294%20%uAC83%20%uCC98%uB7FC%20%uD560%20%uC218%20%uC788%uB2E4.%20%60insert%28%29%60%uC5D0%20%uCCAB%uBC88%uC9F8%20%uC778%uC790%uB85C%20iterable%uC744%20%uB123%uAE30%uB9CC%20%uD558%uBA74%20%uC900%uBE44%20%uB05D%21%20%uC774%uAC83%uC740%20%uAC01%20%uB3C4%uD050%uBA3C%uD2B8%uB97C%20%uB3CC%uBA70%20%uC54C%uC544%uC11C%20insert%uD574%20%uC904%20%uAC83%uC774%uB2E4.%20%uD558%uB098%uC758%20%uBA85%uB839%uC73C%uB85C%20%uB9D0%uC774%uB2E4.%0A%0A%20%20%20%20%3E%3E%3E%20new_posts%20%3D%20%5B%7B%22author%22%3A%20%22Mike%22%2C%0A%20%20%20%20...%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%22%3A%20%22Another%20post%21%22%2C%0A%20%20%20%20...%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22tags%22%3A%20%5B%22bulk%22%2C%20%22insert%22%5D%2C%0A%20%20%20%20...%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22date%22%3A%20datetime.datetime%282009%2C%2011%2C%2012%2C%2011%2C%2014%29%7D%2C%0A%20%20%20%20...%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%22author%22%3A%20%22Eliot%22%2C%0A%20%20%20%20...%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22MongoDB%20is%20fun%22%2C%0A%20%20%20%20...%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%22%3A%20%22and%20pretty%20easy%20too%21%22%2C%0A%20%20%20%20...%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22date%22%3A%20datetime.datetime%282009%2C%2011%2C%2010%2C%2010%2C%2045%29%7D%5D%0A%20%20%20%20%3E%3E%3E%20posts.insert%28new_posts%29%0A%20%20%20%20%5BObjectId%28%27...%27%29%2C%20ObjectId%28%27...%27%29%5D%0A%20%20%20%20%0A%uC774%20%uC608%uC81C%uC5D0%20%uAD00%uD55C%20%uD765%uBBF8%uB85C%uC6B4%20%uC0AC%uC2E4%202%uAC1C%uAC00%20%uC788%uB2E4.%0A%0A-%20%60insert%28%29%60%uB97C%20%uC5EC%uAE30%uC11C%20%uBD80%uB974%uBA74%202%uAC1C%uC758%20%uB4E4%uC5B4%uAC04%20%uAC01%uAC01%uC758%20ObjectId%uAC00%20%uBC18%uD658%uB41C%uB2E4.%0A-%20%60news_posts%5B1%5D%60%uC740%20%uBAA8%uC591%uC774%20%uC870%uAE08%20%uB2E4%uB978%uB370%2C%20tag%uAC00%20%uC544%uB2CC%20title%uC744%20%uAC00%uC9C0%uACE0%20%uC788%uB2E4.%20%uC774%uAC8C%20%uBC14%uB85C%20%uBABD%uACE0%uB514%uBE44%uC5D0%uC11C%20%uB9E8%uB0A0%20%uB9D0%uD558%uB294%20%uADF8%20**%27%uC2A4%uD0A4%uB9C8%uAC00%20%uC5C6%uB2E4%27**%uB2E4%21%0A%0A%23%23%uD55C%20%uB3C4%uD050%uBA3C%uD2B8%20%uC774%uC0C1%uC5D0%uAC8C%20%uCFFC%uB9AC%20%uB358%uC9C0%uAE30%0A%60find%28%29%60%uD568%uC218%uB97C%20%uD1B5%uD558%uBA74%20%uD55C%uAC1C%uC758%20%uB3C4%uD050%uBA3C%uD2B8%20%uC774%uC0C1%uC744%20%uC704%uD55C%20%uCFFC%uB9AC%uB97C%20%uB358%uC9C8%20%uC218%20%uC788%uB2E4.%20%60find%28%29%60%uB294%20%60Cuser%20Instance%60%uB97C%20%uBC18%uD658%uD558%uB294%uB370%2C%20%uC774%uAC83%uC740%20%uB3C4%uD050%uBA3C%uD2B8%uB4E4%uC744%20%uC21C%uD68C%28iterate%29%uD560%20%uC218%20%uC788%uB3C4%uB85D%20%uD574%uC900%uB2E4.%20%uC608%uB97C%uB4E4%uC5B4%20%uC544%uB798%uCC98%uB7FC%20%uC6B0%uB9AC%uB294%20%60posts%60%20%uCEEC%uB809%uC158%uC744%20%uC2F9%20%uC21C%uD68C%uD560%20%uC218%20%uC788%uB2E4.%20%28iterate%20%uD560%20%uC218%20%uC788%uB2E4.%29%0A%0A%20%20%20%20%3E%3E%3E%20for%20post%20in%20posts.find%28%29%3A%0A%20%20%20%20...%20%20%20post%0A%20%20%20%20...%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%28...%29%2C%20u%27text%27%3A%20u%27My%20first%20blog%20post%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Mike%27%2C%20u%27tags%27%3A%20%5Bu%27mongodb%27%2C%20u%27python%27%2C%20u%27pymongo%27%5D%7D%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%282009%2C%2011%2C%2012%2C%2011%2C%2014%29%2C%20u%27text%27%3A%20u%27Another%20post%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Mike%27%2C%20u%27tags%27%3A%20%5Bu%27bulk%27%2C%20u%27insert%27%5D%7D%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%282009%2C%2011%2C%2010%2C%2010%2C%2045%29%2C%20u%27text%27%3A%20u%27and%20pretty%20easy%20too%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Eliot%27%2C%20u%27title%27%3A%20u%27MongoDB%20is%20fun%27%7D%0A%20%20%20%20%0A%60find_one%28%29%60%uCC98%uB7FC%20%uC6B0%uB9AC%uB294%20%60find%28%29%60%uB97C%20%uD1B5%uD574%20%uACB0%uACFC%uC5D0%20%uD544%uD130%28%uC81C%uD55C%29%uC744%20%uAC78%20%uC218%20%uC788%uB2E4.%20%uC608%uB97C%20%uB4E4%uC5B4%20%60MIKE%60%uB77C%uB294%20%60author%60%uB97C%20%uAEBC%uB0B4%uBCF4%uC790.%0A%0A%20%20%20%20%3E%3E%3E%20for%20post%20in%20posts.find%28%7B%22author%22%3A%20%22Mike%22%7D%29%3A%0A%20%20%20%20...%20%20%20post%0A%20%20%20%20...%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%28...%29%2C%20u%27text%27%3A%20u%27My%20first%20blog%20post%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Mike%27%2C%20u%27tags%27%3A%20%5Bu%27mongodb%27%2C%20u%27python%27%2C%20u%27pymongo%27%5D%7D%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%282009%2C%2011%2C%2012%2C%2011%2C%2014%29%2C%20u%27text%27%3A%20u%27Another%20post%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Mike%27%2C%20u%27tags%27%3A%20%5Bu%27bulk%27%2C%20u%27insert%27%5D%7D%0A%20%20%20%20%0A%23%23%uAC2F%uC218%20%uC138%uAE30.%0A%uB9CC%uC57D%uC5D0%20%uCFFC%uB9AC%uC5D0%20%uB9E4%uCE6D%uB418%uB294%20%uB3C4%uD050%uBA3C%uD2B8%uC758%20%uAC2F%uC218%uB9CC%20%uAD81%uAE08%uD558%uB2E4%uBA74%2C%20%uB108%uB294%20%60count%28%29%60%uB97C%20%uC0AC%uC6A9%uD574%uC11C%20%uAE34%20%uCFFC%uB9AC%uB97C%20%uD1B5%uD558%uC9C0%20%uC54A%uACE0%uB3C4%20%uC54C%uC544%20%uB0BC%20%uC218%20%uC788%uB2E4.%0A%20%20%20%20%0A%20%20%20%20%3E%3E%3E%20posts.count%28%29%0A%20%20%20%203%0A%20%20%20%20%0A%uD639%uC740%20%uC0C1%uC138%20%uCFFC%uB9AC%uB97C%20%uB358%uC838%uC11C%uB3C4%20%uC54C%uC544%uB0BC%20%uC218%20%uC788%uB2E4.%0A%0A%20%20%20%20%3E%3E%3E%20posts.find%28%7B%22author%22%3A%20%22Mike%22%7D%29.count%28%29%0A%20%20%20%202%0A%20%20%20%20%0A%23%23%uB2E4%uC591%uD55C%20%uCFFC%uB9AC%uB97C%20%uC4F8%20%uC218%20%uC788%uB2E4.%0A%uBABD%uACE0%uB514%uBE44%uB294%20%uB2E4%uC591%uD55C%20%uD5A5%uC0C1%uB41C%20%uCFFC%uB9AC%uB97C%20%uC81C%uACF5%uD55C%uB2E4.%20%uD574%uB2F9%20%uB0A0%uC9DC%20%uC774%uD6C4%uC758%20%uB3C4%uD050%uBA3C%uD2B8%uB4E4%uC744%20%uB0A0%uC9DC%20%uC21C%uC73C%uB85C%20%uC815%uB82C%uD558%uACE0%20%uADF8%uAC78%20%uB610%20%60author%60%uC21C%uC73C%uB85C%uB3C4%20%uC815%uB82C%uD558%uB294%20%uC608%uB97C%20%uBCF4%uB77C.%0A%0A%20%20%20%20%3E%3E%3E%20d%20%3D%20datetime.datetime%282009%2C%2011%2C%2012%2C%2012%29%0A%20%20%20%20%3E%3E%3E%20for%20post%20in%20posts.find%28%7B%22date%22%3A%20%7B%22%24lt%22%3A%20d%7D%7D%29.sort%28%22author%22%29%3A%0A%20%20%20%20...%20%20%20print%20post%0A%20%20%20%20...%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%282009%2C%2011%2C%2010%2C%2010%2C%2045%29%2C%20u%27text%27%3A%20u%27and%20pretty%20easy%20too%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Eliot%27%2C%20u%27title%27%3A%20u%27MongoDB%20is%20fun%27%7D%0A%20%20%20%20%7Bu%27date%27%3A%20datetime.datetime%282009%2C%2011%2C%2012%2C%2011%2C%2014%29%2C%20u%27text%27%3A%20u%27Another%20post%21%27%2C%20u%27_id%27%3A%20ObjectId%28%27...%27%29%2C%20u%27author%27%3A%20u%27Mike%27%2C%20u%27tags%27%3A%20%5Bu%27bulk%27%2C%20u%27insert%27%5D%7D%0A%20%20%20%20%0A%uC5EC%uAE30%uC11C%20%uC6B0%uB9AC%uAC00%20%uC0AC%uC6A9%uD55C%20%60%26lt%60%20%uC5F0%uC0B0%uC790%uAC00%20%uCFFC%uB9AC%uC758%20%uBC94%uC704%uB97C%20%uC81C%uD55C%uD558%uACE0%20%uADF8%uAC78%20%60sort%28%29%60%uAC00%20%60author%60%uC5D0%20%uB530%uB77C%20%uC21C%uC11C%uB300%uB85C%20%uC815%uB82C%uD588%uB2E4.%0A%0A%23%23%uC778%uB371%uC2F1%0A%uCFFC%uB9AC%uB97C%20%uB354%20%uBE60%uB974%uAC8C%20%uC2E4%uD589%uC2DC%uD0A4%uAE30%20%uC704%uD574%20%uC6B0%uB9AC%uB294%20%60index%60%uB97C%20%60date%60%uB098%20%60author%60%uC5D0%20%uB300%uD574%20%uC0DD%uC131%uD560%20%uC218%20%uC788%uB2E4.%20%uADF8%uB7EC%uAE30%uC704%uD574%20%uBA3C%uC800%20%60explain%28%29%60%20%uBA54%uC18C%uB4DC%uB97C%20%uC0AC%uC6A9%uD574%uC11C%20%uBA87%uAC00%uC9C0%20%uC815%uBCF4%uB97C%20%uC5BB%uC5B4%uBCF4%uC790.%20%60index%60%uC5C6%uC774%20%uC5B4%uB290%uC815%uB3C4%uC758%20%uD37C%uD3EC%uBA3C%uC2A4%uAC00%20%uB098%uC624%uB294%uC9C0%20%uC54C%20%uC218%20%uC788%uB2E4.%0A%0A%20%20%20%20%3E%3E%3E%20posts.find%28%7B%22date%22%3A%20%7B%22%24lt%22%3A%20d%7D%7D%29.sort%28%22author%22%29.explain%28%29%5B%22cursor%22%5D%0A%20%20%20%20u%27BasicCursor%27%0A%20%20%20%20%3E%3E%3E%20posts.find%28%7B%22date%22%3A%20%7B%22%24lt%22%3A%20d%7D%7D%29.sort%28%22author%22%29.explain%28%29%5B%22nscanned%22%5D%0A%20%20%20%203%0A%0A%uC774%uAC78%20%uBCF4%uBA74%20%60BasicCursor%60%uAC00%20%uCFFC%uB9AC%uB97C%20%uCC98%uB9AC%uD558%uACE0%20%uC788%uACE0%2C%20%uAC54%uAC00%20%uCEEC%uB809%uC158%uC5D0%20%uC788%uB294%203%uAC1C%uC758%20%uB3C4%uD050%uBA3C%uD2B8%uB97C%20%uCFFC%uB9AC%uB97C%20%uCC98%uB9AC%uD558%uAE30%20%uC704%uD574%20%uC2A4%uCE90%uB2DD%20%uD588%uB2E4%uB294%20%uC810%uC744%20%uC54C%20%uC218%20%uC788%uB2E4.%0A%uC774%uC81C%20%60index%60%uB97C%20%uAC78%uC5B4%uBCF4%uC790.%0A%0A%20%20%20%20%3E%3E%3E%20from%20pymongo%20import%20ASCENDING%2C%20DESCENDING%0A%20%20%20%20%3E%3E%3E%20posts.create_index%28%5B%28%22date%22%2C%20DESCENDING%29%2C%20%28%22author%22%2C%20ASCENDING%29%5D%29%0A%20%20%20%20u%27date_-1_author_1%27%0A%20%20%20%20%3E%3E%3E%20posts.find%28%7B%22date%22%3A%20%7B%22%24lt%22%3A%20d%7D%7D%29.sort%28%22author%22%29.explain%28%29%5B%22cursor%22%5D%0A%20%20%20%20u%27BtreeCursor%20date_-1_author_1%27%0A%20%20%20%20%3E%3E%3E%20posts.find%28%7B%22date%22%3A%20%7B%22%24lt%22%3A%20d%7D%7D%29.sort%28%22author%22%29.explain%28%29%5B%22nscanned%22%5D%0A%20%20%20%202%0A%20%20%20%20%0A%uC774%uC81C%20%uCFFC%uB9AC%uB97C%20%60BtreeCursor%20%28%uC778%uB371%uC2A4%29%60%uB97C%20%uCC98%uB9AC%uD558%uACE0%2C%20%uC624%uC9C1%20%uB450%uAC1C%uC758%20%uB3C4%uD050%uBA3C%uD2B8%uB9CC%uC774%20%uC2A4%uCE90%uB2DD%20%uB418%uC5C8%uB2E4%uB294%20%uC0AC%uC2E4%uC744%20%uC54C%20%uC218%20%uC788%uB2E4.


comments powered by Disqus
태그, 트랙백, 검색 상자 토글