开始之前当然要导入模块啦:
1
|
>>> import pymongo
|
下一步,必须本地mongodb服务器的安装和启动已经完成,才能继续下去。
建立于MongoClient 的连接:
1
2
3
|
client = MongoClient( 'localhost' , 27017 )
# 或者
client = MongoClient( 'mongodb://localhost:27017/' )
|
得到数据库:
1
2
3
|
>>> db = client.test_database
# 或者
>>> db = client[ 'test-database' ]
|
得到一个数据集合:
1
2
3
|
collection = db.test_collection
# 或者
collection = db[ 'test-collection' ]
|
MongoDB中的数据使用的是类似Json风格的文档:
1
2
3
4
5
|
>>> import datetime
>>> post = { "author" : "Mike" ,
... "text" : "My first blog post!" ,
... "tags" : [ "mongodb" , "python" , "pymongo" ],
... "date" : datetime.datetime.utcnow()}
|
插入一个文档:
1
2
3
4
|
>>> posts = db.posts
>>> post_id = posts.insert_one(post).inserted_id
>>> post_id
ObjectId( '...' )
|
找一条数据:
1
2
3
4
5
6
7
8
|
>>> 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来查找:
1
2
3
4
|
>>> 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:
1
2
3
|
>>> post_id_as_str = str (post_id)
>>> posts.find_one({ "_id" : post_id_as_str}) # No result
>>>
|
如果你有一个post_id字符串,怎么办呢?
1
2
3
4
5
6
|
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)})
|
多条插入:
1
2
3
4
5
6
7
8
9
10
11
|
>>> 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( '...' )]
|
查找多条数据:
1
2
3
4
5
6
|
>>> 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' }
|
当然也可以约束查找条件:
1
2
3
4
5
|
>>> 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' ]}
|
获取集合的数据条数:
1
|
>>> posts.count()
|
或者说满足某种查找条件的数据条数:
1
|
>>> posts.find({ "author" : "Mike" }).count()
|
范围查找,比如说时间范围:
1
2
3
4
5
6
|
>>> 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是小于的意思。
如何建立索引呢?比如说下面这个查找:
1
2
3
|
>>> posts.find({ "date" : { "$lt" : d}}).sort( "author" ).explain()[ "cursor" ]
u 'BasicCursor'
>>> posts.find({ "date" : { "$lt" : d}}).sort( "author" ).explain()[ "nscanned" ]
|
建立索引:
1
2
3
4
5
6
|
>>> 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" ]
|
连接聚集
1
2
3
|
>>> account = db.Account
#或
>>> account = db[ "Account" ]
|
查看全部聚集名称
1
|
>>> db.collection_names()
|
查看聚集的一条记录
1
2
3
4
|
>>> db.Account.find_one()
>>> db.Account.find_one({ "UserName" : "keyword" })
|
查看聚集的字段
1
2
3
4
5
6
|
>>> 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' }
|
查看聚集的多条记录
1
2
3
4
5
6
|
>>> for item in db.Account.find():
item
>>> for item in db.Account.find({ "UserName" : "libing" }):
item[ "UserName" ]
|
查看聚集的记录统计
1
2
3
4
|
>>> db.Account.find().count()
>>> db.Account.find({ "UserName" : "keyword" }).count()
|
聚集查询结果排序
1
2
3
|
>>> db.Account.find().sort( "UserName" ) #默认为升序
>>> db.Account.find().sort( "UserName" ,pymongo.ASCENDING) #升序
>>> db.Account.find().sort( "UserName" ,pymongo.DESCENDING) #降序
|
聚集查询结果多列排序
1
|
>>> db.Account.find().sort([( "UserName" ,pymongo.ASCENDING),( "Email" ,pymongo.DESCENDING)])
|
添加记录
1
|
>>> db.Account.insert({ "AccountID" : 21 , "UserName" : "libing" })
|
修改记录
1
|
>>> db.Account.update({ "UserName" : "libing" },{ "$set" :{ "Email" : "libing@126.com" , "Password" : "123" }})
|
删除记录
1
2
3
4
|
>>> db.Account.remove() - - 全部删除
>>> db.Test.remove({ "UserName" : "keyword" })
|