MongoDB数据库


MongoDB数据库
1、MongoDB是一个面向文档存储的数据库,操作简单容易
2、可以在MongoDB记录中设置任何属性值的索引来实现更快的排序
3、通过本地或者网络创建数据镜像
4、若负载增加,它可以分布在计算机网络中的其他节点上
5、查询指令使用JSON形式编辑,可以轻易查询文档中内嵌的对象及数组
6、MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段
7、Map/Reduce函数(使用JavaScript辨析):用于对数据进行批量处理和聚合操作
MAP函数调用emit(key,value)遍历集合中所有记录,将key与value传给Reduce函数。
通过使用db.runCommand或mapreduce来执行MapReduce操作
8、GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件
9、可以使用JavaScript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可

安装问题:
安装的时候注意选择服务类型,新版安装的时候已经生成了数据目录与日志目录,不需要再重新配置
MongoDB数据库区别于SQL数据库
SQL:       MongoDB:
database    database     数据库
table       collection   数据表/集合
row         document     数据记录行/文档
column      field        数据字段/域
index       index        索引
table joins  无          表连接
primary key  primary key 主键,MongoDB自动将_id字段设置为主键
文档
文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符
文档命名规范
键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。
python中的MongoDB
1、连接MongoDB
准备pyMongo库,PyMongo库里面的MongoClient可以连接数据库,一般来说,传入MongoDB的IP及端口即可以连接,其中第一个参数是host,第二个参数是端口port(一般默认为27017)
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
等价于
client = MongoClient('mongodb://localhost:27017/')
2、指定数据库
db=client.test
等价于
db = client['test']
3、指定集合
collection = db.students
等价于
collection = db['student']
4、插入数据
新建一条学生数据,这条数据以字典的形式表示
student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}
用字典存储了一条学生的数据,接下来可以直接电泳collection的insert()方法即可插入数据
result = collection.insert(student)
print(result)
在MongoDB数据库中,每条数据都有一个_id属性来唯一表示。如果没有显式指明该属性,自动产生objectID类型的id属性。insert()方法会在执行后返回_id值
插入多条数据时
student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}
student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}
result = collection.insert([student1, student2])
print(result)
返回的_id结果时
[ObjectId('5932a80115c2606a59e8a048'), ObjectId('5932a80115c2606a59e8a049')]
注意:
在PyMongo 3.x版本中,官方已经不推荐使用insert()方法了。当然,继续使用也没有什么问题。官方推荐使用insert_one()和insert_many()方法来分别插入单条记录和多条记录
单条数据插入
student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}
result = collection.insert_one(student)
print(result)
print(result.inserted_id)
打印结果
<pymongo.results.InsertOneResult object at 0x10d68b558>
5932ab0f15c2606f0c1cf6c5
多条数据插入
student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}
student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}
result = collection.insert_many([student1, student2])
print(result)
print(result.inserted_ids)
运行结果
<pymongo.results.InsertManyResult object at 0x101dea558>
[ObjectId('5932abf415c2607083d3b2ac'), ObjectId('5932abf415c2607083d3b2ad')]
6、查询
利用find_one()或find()方法进行查询
查询单条数据
result = collection.find_one({'name': 'Mike'})
print(type(result))
print(result)
运行结果
<class 'dict'>
{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}
同样可以使用ObjectID来查询
from bson.objectid import ObjectId
result = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})
print(result)
运行结果
{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}
查询多条数据
results = collection.find({'age': 20})
print(results)
for result in results:
    print(result)
运行结果
<pymongo.cursor.Cursor object at 0x1032d5128>
{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('593278c815c2602678bb2b8d'), 'id': '20170102', 'name': 'Kevin', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('593278d815c260269d7645a8'), 'id': '20170103', 'name': 'Harden', 'age': 20, 'gender': 'male'}
返回结果是Cursor类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。
比较运算符
$lt  小于    {'age': {'$lt': 20}}
$gt  大于     {'age': {'$gt': 20}}
$lte 小于等于 {'age': {'$lte': 20}}
$gte 大于等于  {'age': {'$gte': 20}}
$ne  不等于    {'age': {'$ne': 20}}
$in  在范围内  {'age': {'$in': [20, 23]}}
$nin 不在范围内 {'age': {'$nin': [20, 23]}}
使用正则匹配进行查询
results = collection.find({'name': {'$regex': '^M.*'}})
这里使用$regex来指定正则匹配,^M.*代表以M开头的正则表达式
$regex    匹配正则表达式  {'name': {'$regex': '^M.*'}}                      name以M开头
$exists   属性是否存在    {'name': {'$exists': True}}                       name属性存在
$type     类型判断        {'age': {'$type': 'int'}}       age的类型为int
$mod      数字模操作      {'age': {'$mod': [5, 0]}}       年龄模5余0
$text     文本查询        {'$text': {'$search': 'Mike'}}     text类型的属性中包含Mike字符串
$where    高级条件查询    {'$where': 'obj.fans_count == obj.follows_count'} 自身粉丝数等于关注数
6、计数
统计查询结果有多少条数据,调用count()方法,

count = collection.find({'age': 20}).count()
print(count)

7、排序
直接调用sort()方法,并在其中传入排序的字段及升降序标志即可
results = collection.find().sort('name', pymongo.ASCENDING)
print([result['name'] for result in results])
结果
['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike']
这里调用pymongo.ASCENDING制定为升序,(降序:pymongo.DESCENDING)
8、偏移
取其中的几个元素,我们使用skip()方法偏移几个位置,eg.偏移2,就可忽略前两个元素得到三个以及以后的元素
results = collection.find().sort('name', pymongo.ASCENDING).skip(2)
print([result['name'] for result in results])
运行结果:
['Kevin', 'Mark', 'Mike']
同样也可以使用limit()方法指定要取得结果数
results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)
print([result['name'] for result in results])
运行结果
['Kevin', 'Mark']
注意,取大量数据得时候需要注意查询数据,且最好不要使用偏移量来查询数据,这样容易导致内存溢出
可以使用一下方法来记录:
from bson.objectid import ObjectId
collection.find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}})

9、更新
对于数据的更新,使用update()方法,指定更新条件和更新后的数据即可进行更新
如果需要执行更新操作,首先指定查询条件,然后将数据查询出来,修改年龄后调用update()方法将原条件和修改的数据传入
condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update(condition, student)
print(result)
运行结果:
{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
ok代表执行成功,nModified代表影响的数据条数
同样可以使用$set操作符对数据进行更新
result = collection.update(condition, {'$set': student})
这样可以只更新student字典内存在的字段。如果原先还有其他字段,则不会更新,也不会删除。而如果不用$set的话,则会把之前的数据全部用student字典替换;如果原本存在其他字段,则会被删除。
10、删除
删除操作比较简单,直接调用remove()方法指定删除的条件即可,此时符合条件的所有数据均会被删除
result = collection.remove({'name': 'Kevin'})
print(result)
运行结果:
{'ok': 1, 'n': 1}
这里依然存在两个新的推荐方法——delete_one()和delete_many()
delete_one()即删除第一条符合条件的数据,delete_many()即删除所有符合条件的数据。它们的返回结果都是DeleteResult类型,可以调用deleted_count属性获取删除的数据条数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值