Mongodb的索引操作
1. 为什么mongdb需要创建索引
• 加快查询速度
• 进行数据的去重
2. mongodb创建简单的索引方法
• 语法:db.集合名.ensureIndex({属性:1}),1表示升序, -1表示降序
3. 创建索引前后查询速度对比
测试:插入10万条数据到数据库中
插入数据
for(i=0;i<100000;i++){db.test.insert({name:'test'+i,age:i})}
创建索引前
db.test.find({name:'test9999'})
db.test.find({name:'test9999'}).explain('executionStats') # 显示查询操作的详细信息
创建索引
db.test.ensureIndex({name:1})
创建索引后
db.test.find({name:'test9999'}).explain('executionStats')
4. 索引的查看
默认情况下_id是集合的索引
查看方式:db.集合名.getIndexes()
5. 删除索引
语法:db.集合名.dropIndex({'索引名称':1})
db.test.dropIndex({name:1})
db.test.getIndexes()
6. mongodb创建唯一索引
在默认情况下mongdb的索引域的值是可以相同的,创建唯一索引之后,数据库会在插入数据的时候检查创建索引域的值是否存在,如果存在则不会插入该条数据,但是创建索引仅仅能够提高查询速度,同时降低数据库的插入速度。
6.1 添加唯一索引的语法
db.集合名.ensureIndex({"字段名":1}, {"unique":true})
6.2 利用唯一索引进行数据去重
根据唯一索引指定的字段的值,如果相同,则无法插入数据
db.t1.ensureIndex({"name":1}, {"unique":true})
db.t1.insert({name: 'test10000'})
7. 建立复合索引
在进行数据去重的时候,可能用一个域来保证数据的唯一性,这个时候可以考虑建立复合索引来实现。
例如:抓全贴吧信息,如果把帖子的名字作为唯一索引对数据进行去重是不可取的,因为可能有很多帖子名字相同
建立复合索引的语法:db.collection_name.ensureIndex({字段1:1,字段2:1})
8. 建立索引注意点
• 根据需要选择是否需要建立唯一索引
• 索引字段是升序还是降序在单个索引的情况下不影响查询效率,但是带复合索引的条件下会有影响
• 数据量巨大并且数据库的读出操作非常频繁的时候才需要创建索引,如果写入操作非常频繁,创建索引会影响写入速度
Mongodb与python的交互
pymongo安装
pip install pymongo
连接数据库
方式一
client = MongoClient()
方式二 指定端口和地址
client = MongoClient('localhost',27017)
方式三 使用URI 不是URL
client = MongoClient('mongodb://localhost:27017/')
新增数据
from pymongo import MongoClient
from datetime import datetime
class TestMongo(object):
def __init__(self):
self.client = MongoClient('mongodb://localhost:27017/')
# 也可以指定连接的集合client['admin']['students']
self.db = self.client['admin']
# print(self.client.database_names())
def add_one(self):
post = {'title':'标题','content':'内容','created_at':datetime.now()}
# db.students students 是表明
res = self.db.students.insert_one(post)
return res
def add_more(self):
data_list = [{"name":"test{}".format(i)} for i in range(5)]
res = self.db.students.insert_many(data_list)
return res
mongo = TestMongo()
res = mongo.add_one()
插入的ID
print(res.inserted_id)
查询数据
from bson.objectid import ObjectId
查询一条数据
def get_one(self):
return self.db.students.find_one()
查询多条数据
def get_more(self):
return self.db.students.find()
根据记录的ID查询数据
def get_from_id(self,id):
return self.db.students.find_one({'_id':ObjectId(id)})
查询一条数据
res = mongo.get_one()
查询多条数据
res = mongo.get_more()
for i in res:
print(i)
根据记录的ID查询数据
res = mongo.get_from_id('5b83e8a1b594c32e8c70c1f7')
print(res)
修改数据
修改单条数据
def update(self):
res = self.db.students.update_one({'title':'标题'},{'$set':{'title':'title-2'}})
# 匹配的数据条数
print(res.matched_count)
# 影响的数据条数。
print(res.modified_count)
修改多条
def update_more(self):
res = self.db.students.update_many({},{'$set':{'x':1}})
print(res.matched_count)
print(res.modified_count)
res = self.db.students.update({'x':2},{'$set':{'x':3}},True)
res = mongo.update()
res = mongo.update_more()
删除数据
删除一条
def delete_one(self):
res = self.db.students.delete_one({'title':'title-2'})
print(res.deleted_count)
删除多条
def delete_more(self):
res = self.db.students.delete_many({'x':2})
print(res.deleted_count)
res = mongo.delete_one()
res = mongo.delete_more()