开始之前当然要导入模块啦:
>>> 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\"})
上一篇:Python实现控制台进度条功能