PyMongo操作Mongo Database
1.连接到MongoDB客户端,使用默认主机(localhost),默认端口号(27017)
import pymongo
from pymongo import MongoClient
client = MongoClient()
client = MongoClient('localhost',27017)
也可使用MongoDB URI格式
client = MongoClient('mongodb://localhost:27017/')
2.使用数据库
属性风格:
db = client.数据库名
示例:
db = client.test
字典风格:
db = client['test']
注意: MongoDB数据库和集合,都是在插入第一条文档后才正式创建的。
删除数据库:db.dropDatabase()
3.连接到集合
属性风格:
collection = db.集合名
示例:
collection = db.posts
字典风格:
collection = db['posts']
删除posts集合: db.posts.drop()
4.文档
MongoDB中数据是JSON风格的文档。在PyMongo中,我们用字典表示文档。
post = {
'author':'Mike',
'text':'My first blog post!',
'tags':['mongodb','python','pymongo'],
'likes':10
}
5.插入一条文档insert_one()
db.posts.insert_one(post)
生成一个叫library的数据库
db = client.library
生成一个叫books的集合
collection = db.books
生成一条叫book的文档:
书名title,作者author,出版社publisher,价格price
book = {
'title':'A Small World',
'author':'Ann',
'publisher':'renming press',
'price':100
}
把book文档插入到books集合中
db.books.insert_one(book)
在mongo客户端,查看新生成的数据库,集合,以及文档内容
use library
db.books.find().pretty()
find_one():返回满足查找条件的“一个”文档,如果不存在,返回None。
示例:
db = client.gaodb # 转到某个数据库下
db.posts.find_one() #查看该数据库里posts集合中的一个文档
pprint模块:格式化输出文档。
from pprint import pprint
pprint(db.posts.find_one())
document = db.posts.find_one()
pprint(document)
find_one({满足的条件},{选择显示的键:1,或者需要隐藏的键:0})
示例:
查找gaodb,posts集合中,Mike发的贴子,并隐藏_id键,只显示author和text键
db.posts.find_one({'author':'Mike'},{"_id":0,"author":1,"text":1})
db.posts.find_one({'author':'Lily'},{"_id":0,"author":1,"text":1})
练习:
把library中,books集合里,price大于50的书的title和price列出来,隐藏_id键
db = client.library
db.books.find_one({'price':{'$gt':50}}, {"_id":0, "title":1, "price":1})
【注意】
'$gt'引号必须有。
MongoDB按照JSON格式存贮数据,JSON字符串是UTF-8编码,
所以,PyMongo也要保证任何字符串是UTF-8格式。
6.批量插入insert_many()
db = client.gaodb
new_posts = [
{
"author":"Jimmy",
"text":"another post",
"tags":["bulkinsert","pymongo","python"],
"likes":20
},
{
"author":"Emily",
"text":"mongodb is fun",
"tags":["pymongo","python"],
"likes":30
}
]
db.posts.insert_many(new_posts)
7.查询多个文档find()
db.posts.find()返回cursor游标对象
for post in db.posts.find():
pprint(post)
练习:
找出posts集合中,likes不小于15的文档,只显示author,text,likes三列
documents = db.posts.find({'likes':{'$gte':15}},{'author':1,'text':1,'likes':1,'_id':0})
for post in documents:
pprint(post)
找出gaodb,posts集合中,tags包含"python"和"pymongo",并且长度为2的文档内容,只显示text和tags两列信息 提示:$all $size $and
documents = db.posts.find(
{
"$and":[
{"tags":{"$size":2}},
{"tags":{"$all":["python","pymongo"]}}
]
},
{"_id":0,"text":1,"tags":1}
)
for post in documents:
pprint(post)
8.count()计数:
查询一个集合中有多少条文档
db.posts.count()
查询posts中tags有三个标签的文档一共有多少条
db.posts.find({"tags":{"$size":3}}).count()
9.sort()排序
把posts集合中的文档按照likes排序
for post in db.posts.find().sort("likes"):
pprint(post)
练习:
把posts中likes大于15的文档,按照author姓名排序打印出来
for post in db.posts.find({"likes":{"$gt":15}}).sort("author"):
pprint(post)
10.修改一条文档update_one()
db.集合名.update_one({要满足的条件},{修改的内容})
例子:
把posts中,Jimmy发的贴子内容"text"改为"revised post"
db.posts.update_one({"author":"Jimmy"},{"$set":{"text":"revised post"}})
db.posts.find_one({"author":"Jimmy"})
练习题:
把posts中,Mikes发的贴子的likes增加3,要求用$inc修改器试一下。
db.posts.update_one({"author":"Mikes"},{"$inc":{"likes":3}})
把Emily发的贴子中的tags中叫"python"的标签删除
提示:$pop,$pull
db.posts.update_one({"author":"Emily"},{"$pop":{"tags":1}})
db.posts.update_one({"author":"Emily"},{"$pull":{"tags":"python"}})
11.更新多个文档update_many()
db.集合名.update_many({满足的条件},{修改的内容})
例子:
把posts中,所有文档的tags标签中添加一个"database"标签
db.posts.update_many({},{"$push":{"tags":"database"}})
for post in db.posts.find({}, {"_id":0}):
pprint.pprint(post)
练习:
把posts中,tags含有"python"这个标签的文档的likes增加5
要求:update_many({条件},{修改器,修改的内容})
db.posts.update_many({"tags":{"$in":["python"]}},{"$inc":{"likes":5}})
for p in db.posts.find({}, {"_id":0}):
pprint.pprint(p)
把posts中,likes大于20的文档的总数列出来
提示:count()
db.posts.find({"likes":{"$gt":20}}).count()
12.删除文档delete_one(), delete_many()
db.集合名.delete_one({条件}) 删除一条文档
db.集合名.delete_many({条件}) 删除多条文档
练习:
把posts中,Emily发的贴子删除,要求用delete_one()
db.posts.delete_one({"author":"Emily"})
把posts中,likes小于100的贴子全部删除,要求用delete_many()
db.posts.delete_many({"likes":{"$lt":100}})
13.mongodb BIMFeaturesProperties库 小学机电合模 集合 获取所有 feature的类别及属于该类的feature的数量 的查询
mongo vs pymongo
1.mongo
db['小学-机电合模'].aggregate([
{$group:{_id:"$cust_id", total:{$sum:"$amount"}}}
])
2.pymongo
db['小学-机电合模'].aggregate([
{"$group":{"_id":"$name", "total":{"$sum":1}}}
])
db['小学-机电合模'].find({"name": "内外热镀锌钢管-丝接与卡箍"}).pretty().limit(1)
db['小学-机电合模'].find({"name":"消防桥架", "壁厚": 0},{"_id":0, "id":1, "壁厚": 1}).pretty()
doc = db[collectionName].aggregate([
{$match:{"name": "消防桥架"}},
{"$group": {"_id": "$尺寸", "total": {"$sum": 1}}}
])