开始之前当然要导入模块啦:

>>> import pymongo

下一步,必须本地mongodb服务器的安装和启动已经完成,才能继续下去。

建立于MongoClient 的连接:

client = MongoClient(\'localhost\', 27017)
# 或者
client = MongoClient(\'mongodb://localhost:27017/\')

得到数据库:

>>> db = client.test_database
# 或者
>>> db = client[\'test-database\']

得到一个数据集合:

collection = db.test_collection
# 或者
collection = db[\'test-collection\']

MongoDB中的数据使用的是类似Json风格的文档:

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

插入一个文档:

>>> posts = db.posts
>>> post_id = posts.insert_one(post).inserted_id
>>> post_id
ObjectId(\'...\')

找一条数据:

>>> 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\']}

>>> 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\']}

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

通过ObjectId来查找:

>>> 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
>>>

如果你有一个post_id字符串,怎么办呢?

from bson.objectid import ObjectId

# The web framework gets post_id from the URL and passes it as a string
def get(post_id):
  # Convert from string to ObjectId:
  document = client.db.collection.find_one({\'_id\': ObjectId(post_id)})

多条插入:

>>> 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)}]
>>> result = posts.insert_many(new_posts)
>>> result.inserted_ids
[ObjectId(\'...\'), ObjectId(\'...\')]

查找多条数据:

>>> 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\'}

当然也可以约束查找条件:

>>> 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\']}

获取集合的数据条数:

>>> posts.count()

或者说满足某种查找条件的数据条数:

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

范围查找,比如说时间范围:

>>> 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是小于的意思。

如何建立索引呢?比如说下面这个查找:

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

建立索引:

>>> 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\"]


连接聚集

>>> account = db.Account
#或 
>>> account = db[\"Account\"]

 

查看全部聚集名称

>>> db.collection_names()

 

查看聚集的一条记录

>>> db.Account.find_one()
 

>>> db.Account.find_one({\"UserName\":\"keyword\"})

 

查看聚集的字段

>>> db.Account.find_one({},{\"UserName\":1,\"Email\":1})
{u\'UserName\': u\'libing\', u\'_id\': ObjectId(\'4ded95c3b7780a774a099b7c\'), u\'Email\': u\'libing@35.cn\'}
 

>>> db.Account.find_one({},{\"UserName\":1,\"Email\":1,\"_id\":0})
{u\'UserName\': u\'libing\', u\'Email\': u\'libing@35.cn\'}

 

查看聚集的多条记录

>>> for item in db.Account.find():
    item
 

>>> for item in db.Account.find({\"UserName\":\"libing\"}):
    item[\"UserName\"]

 

查看聚集的记录统计

>>> db.Account.find().count()
 

>>> db.Account.find({\"UserName\":\"keyword\"}).count()

 

聚集查询结果排序

>>> db.Account.find().sort(\"UserName\") #默认为升序
>>> db.Account.find().sort(\"UserName\",pymongo.ASCENDING)  #升序
>>> db.Account.find().sort(\"UserName\",pymongo.DESCENDING) #降序

 

聚集查询结果多列排序

>>> db.Account.find().sort([(\"UserName\",pymongo.ASCENDING),(\"Email\",pymongo.DESCENDING)])

 

添加记录

>>> db.Account.insert({\"AccountID\":21,\"UserName\":\"libing\"})

 

修改记录

>>> db.Account.update({\"UserName\":\"libing\"},{\"$set\":{\"Email\":\"libing@126.com\",\"Password\":\"123\"}})

 

删除记录

>>> db.Account.remove()  -- 全部删除
 

>>> db.Test.remove({\"UserName\":\"keyword\"})