MongoDB是目前最流行的NoSQL数据库之一,使用的数据类型为BSON(类似JSON)。Python要连接MongoDB需要驱动,推荐使用PyMongo。PyMongo是一个用于MongoDB的Python工具,也是一个被推荐的Python操作MongoDB数据库的方式。
安装PyMongo
pip install pymongo
基本连接操作
# 引入pymongo
import pymongo
# 使用MongoClient创建连接,并且指定连接的URL地址。
client = pymongo.MongoClient('mongodb://localhost:27017')
# 使用账号密码验证。
client = pymongo.MongoClient('mongodb://username:password@localhost:27017')
# 访问数据库对象
db = client['database']
# 访问集合对象
col = db['collection']
基本数据操作
插入数据
使用insert_one()
方法和insert_many()
方法来向MongoDB的集合中插入文档。如果所插入的集合在MongoDB中不存在,MongoDB将为你自动创建一个集合。
# 插入一个文档
data = {...}
db["dbname"].insert_one(data)
# 也可以使用
db["dbname"].update({"field": "value"}, dict(data), True)
# 插入多个文档
data = [{...},{...},{...}]
db["dbname"].insert_many(data)
查询数据
通过find()
方法产生一个查询来从MongoDB的集合中查询到数据。MongoDB中所有的查询条件在一个集合中都有一个范围。
基本查询
# 查询一条数据
db["dbname"].find_one({"field": "value"})
# 获取所有的文档
db["dbname"].find()
# 相等条件查询
db["dbname"].find({"field": "value"})
# 嵌入式文档中查询
db["dbname"].find({"field.field1": "value"})
指定字段
查询指定字段的数据,将要返回的字段对应值设置为1。如果设置了一个字段为0,则其他的都为1,反之亦然。
mddb["dbname"].find_one({},{"field1": 1, "field2": 1})
条件操作符
比较操作符"$lt"、"$lte"、"$gt"、"$gte"、"$ne"
对应于”<“、”<=”、”>”、”>=”、”!=”。
# $gt 大于
db["dbname"].find({"field": {"$gt": 10}})
# $lt 小于
db["dbname"].find({"field": {"$lt": 10}})
# $ne 不等于
db["dbname"].find({"field": {"$ne": 10}})
# $in 属于
db["dbname"].find({"field": {"$in": ["value1","value2"]}}
# $nin 不属于
db["dbname"].find({"field": {"$nin": ["value1","value2"]}})
# $or 或
dbdb["dbname"].find({"$or": [{"field1": "value1"}, {"field2": "value2"}]})
正则表达式
db["dbname"].find({"field":{"$regex": "关键词"}}}
# 不区分大小写
db["dbname"].find({"field":{"$regex": "Key"}, "$options": 'i'}}
排序sort()
升序:pymongo.ASCENDING或1,降序:pymongo.DESCENDING或-1,不指定默认升序。
# 升序排序
dbdb["dbname"].find().sort("key", pymongo.ASCENDING)
# 多条件排序
db["dbname"].find().sort([("key1", 1), ("key2", -1)])
Limit与Skip
# 查询指定数量的数据
ddb["dbname"].find().limit(5)
# 跳过指定数量的数据
db["dbname"].find().skip(5)
# 组合使用
db["dbname"].find().skip(5).limit(5)
skip(), limilt(), sort()三个组合使用时,执行顺序是先sort(), 然后是skip(),最后是显示的limit()。
统计结果数量
count = db["dbname"].find({"field": "value"}).count()
# 官方最新方法
count = db["dbname"].count_documents({"field": "value"})
更新数据
更新特定字段
使用update_one()
和update_many
方法更新集合中的文档。update_one()
方法一次更新一个文档。使用update_many()
方法可以更新所有符合条件的文档。
# 更新一条数据
db["dbname"].update_one({"field": "value"},{"$set": {"key1": "value1"}})
# 更新嵌入式文档字段
db["dbname"].update_one({"field": "value"},{"$set": {"key1.key2": "value1"}})
# 也可以使用
db["dbname"].update({"field": "value"},{"$set": {"key1.key2": "value1"}})
替换一个文档
data = {...}
db["dbname"].replace_one({"field": "value"},data})
# 也可以使用
ddb["dbname"].update({"field": "value"}, dict(data), True)
删除数据
使用delete_one()
以及delete_many()
方法从集合中删除文档。方法需要一个条件来确定需要删除的文档。
# 删除一条
db["dbname"].delete_one({"field": "value"})
# 删除所有
db["dbname"].delete_many({"field": "value"})
# 删除一个集合
db["dbname"].drop()
PyMongo索引
索引可以对查询的高效执行起到支持,MongoDB会在创建文档的时候自动为_id
字段创建索引。
# 创建索引
db["dbname"].create_index([("field", 1)])
# 创建复合索引
db["dbname"].create_index([("field1", pymongo.ASCENDING),("field2", pymongo.DESCENDING)])
# 删除索引
db["dbname"].drop_index([("field", 1)])
# 查看索引信息
ddb["dbname"].index_information()
以上只是PyMongo的一些常用操作,完整内容请查看MongoDB官方英文文档。