NoSQL,non-relational sql,非关系型数据库
`sudo apt-get install -y mongodb-org`
查看帮助:`mongdb --help`
服务启动:`sudo service mongod start`
服务停止:`sudo service mongod stop`
服务重启:`sudo service mongod restart`
查看是否启动成功:`ps aux|grep mongod`
配置文件的位置:`/etc/mongodb.conf`
默认端口:`27017`
日志的位置:`/var/log/mongodb/mongod.log`
启动本地客户端:`mongo`
查看帮助:`mongo --help`
退出:`exit或者ctrl+c`
查看当前的数据库:`db`
查看所有的数据库:`show dbs / show databases`
切换数据库:`use db_name`
删除当前的数据库:`db.dropDatabase()`
不手动创建集合:
向不存在的集合中第一次加入数据时,集合会被创建出来
手动创建集合:
`db.createCollection(name,options)`
`db.createCollection("stu")`
`db.createCollection("sub",{capped:true,size:10})`
参数capped:默认值为false表示不设置上限,值为true表示设置上限
参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
`Object ID`:文档ID
`String`:字符串,最常用,必须是有效的utf8
`Boolean`:存储一个布尔值,true或false
`Integer`:整数可以是32位或64位,这取决于服务器
`Double`:存储浮点值
`Arrays`:数据或列表,多个值存储到一个键
`Object`:用于嵌入式的文档,即一个值为一个文档
`Null`:存储Null值
`Timestamp`:时间戳,表示从1970-1-1到现在的总秒数
`Date`:存储当前日期或时间的UNIX时间格式
(1)创建日期语句如下:
参数的格式为YYYY-MM-DD
(2)每个文档都有一个数据,为_id,保证每个文档的唯一性
可以自己去设置_id插入文档,如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID
(3)objectID是一个12个字节的十六进制数:
1)前4个字节为当前时间戳
2)接下来3个字节为机器的id
3)接下来的2个字节为MongoDB的服务进程id
4)最后3个字节是简单的增量值
(1)在集合中插入数据:`db.集合名字.insert({"key":"value"})`
(2 )在集合中查找数据:`db.集合名字.find()`
`db.stu.isnert({name:"gj",gender:1})`
`db.stu.insert({_id:"20200507",name:‘gj‘,gender:1})`
如果文档的_id已经存在则修改,如果文档的_id不存在则添加
参数query:查询条件
pretry():美化输出
例子`db.stu.find({age:18}).pretty()`
参数query:查询条件
参数update:更新操作符
参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
`db.stu.update({name:"hr‘},{name:"mnc"})` 更新一条,所有值都会被替换,只留下name属性和值
`db.stu.update({name:"hr"},{$set:{name:"hys"}})` 更新一条,$set配合update使用,指定一个值来更新
`db.stu.update({},{$set:{gender:0}},{multi:true})` 更新全部,multi必须配合$符号一起使用,否则会无效
注意:“multi update only works with $ operators”
`db.集合名称.remove(<query>,{justOne:<boolean>})`
参数query:可选,删除的文档的条件
参数justOne:可选,如果设为true或1,则只删除一条,默认为false表示删除多条
`db.集合名称.find({条件文档})`
`db.集合名称.findOne({条件文档})`
`db.集合名称.find({条件文档}).pretty()`
`db.stu.find({age:18}).pretty()`
`db.stu.find(age:{$gte:18})` 查找年龄大于等于18的匹配项
例如:查询年龄为18、28或38的学生 `db.stu.find({age:{$in:[18,28,38]}})`
例如:查询年龄大于或等于18,并且性别为true的学生 `db.stu.find({age:{$gte:18},gender:true})`
例如:查询年龄大于18,或性别为false的学生 `db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})`
例如:查询年龄大于18或性别为男生,并且姓名是小王 `db.stu.find({$or:[{age:{$gt:18}},{gender:false}],name:"xw"})`
例如:查询姓黄的学生 `db.stu.find({name:/^黄/})`
查询以花结尾的学生姓名 `db.stu.find({name:{$regex:"花$"}})`
`db.集合名称.find().limit(NUMBER)`
例如:查询2条学生信息 `db.stu.find().limit(2)`
`db.集合名称.find().skip(NUMBER)`
例如:跳过前两条数据查询 `db.stu.find().skip(2)`
函数语法支持js
例如:查询年龄大于30的学生
```
db.stu.find({
$where:function(){
return this.age>30;
}
})
```
在查询到的返回结果中,只选择必要的字段
参数为字段与值,值为1表示显示,值为0不显示
特殊:对于_id列默认是显示的,如果不显示需要明确设置为0
例如:`db.stu.find({},{_id:0,name:1,gender:1})`
方法sort(),用于对集合进行排序
参数1为升序排列
参数-1为降序排列
例如:根据性别降序,再根据年龄升序 `db.stu.find().sort({gender:-1,age:1})`
例如:`db.stu.find({gender:true}).count()`
`db.stu.count({age:{$gt:200},gender:true})`
例如:`db.stu.distinct("hometown",{age:{$gt:18}})`
-h:服务器地址,也可以指定端口号
-d:需要备份的数据库名称
-o:备份的数据存放位置,此目录中存放着备份出来的数据
例如:`mongodump -h 192.168.0.103:27017 -d test -o ~/Desktop/testback`
-h:服务器地址
-d:需要恢复的数据库实例
--dir:备份数据所在位置
`mongorestore -h 192.168.0.100:27017 -d test_back --dir ~/Desktop/testback/test`
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
在mongodb中,文档处理完毕后,通过管道进行下一次处理
`$group`:将集合中的文档分组,可用于统计结果
`$match`:过滤数据,只输出符合条件的文档
`$project`:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
`$sort`:将输入文档排序后输出
`$limit`:限制聚合管道返回的文档数
`$skip`:跳过指定数量的文档,并返回余下的文档
`$unwind`:将数组类型的字段进行拆分
处理输入文档并输入
语法:表达式:‘$列名‘
常用表达式:
`$sum`:计算总合,$sum:1 表示以1倍计数
`$avg`:计算平均值
`$min`:获取最小值
`$max`:获取最大值
`$push`:在结果文档中插入值到一个数组中
`$first`:根据资源文档的排序获取第一个文档数据
`$last`:根据资源文档的排序获取最后一个文档数据
例如:统计男生、女生的总人数
```
db.stu.aggregate(
{$group:{_id:"$gender",counter:{$sum:1}}}
)
```
1)将集合中所有文档分为一组
例如:求学生总人数、平均年龄
```
db.stu.aggregate(
{$group:{_id:null,counter:{$sum:1},avAge:{$avg:‘$age‘}}}
)
```
1)$group对应的字典中有几个键,结果中就有几个键
2)分组依据需要放到_id后面
3)取不同的字段的值需要使用$,如`$gender`,`$age`
4)取字典嵌套的字典中的值的时候用点`.`操作`$_id.country`
5)能够同事按照多个键进行分组`{$group:{_id:{country:"$country",province:"$province"}}`
例如:查询学生的姓名、年龄
```
db.stu.aggregate(
{$project:{_id:0,name:1,age:1}}
)
```
例如:查询男生、女生人数,输出人数
```
db.stu.aggregate(
{$group:{_id:"$gender",counter:{$sum:1},avg_age:{$avg:"$age"}}},
{$project:{_id:0,counter:1,avg_age:1,gender:"$_id",count:"$count",avg_age:"$avg_age"}}
)
```
match是管道命令,能将结果交给后一个管道,但是find不可以
例如:查询年龄大于20的学生
```
db.stu.aggregate(
{$match:{age:{$gt:20}}}
)
```
例如:查询年龄大于20的男生、女生人数
```
db.stu.aggregate(
{$match:{age:{$gt:20}}},
{$group:{_id:"$gender",count:{$sum:1}}},
{$project:{gender:"$_id",_id:0,count:"$count"}}
)
```
将输入文档排序后输出
例如:查询男生、女生人数,按人数降序
```
db.stu.aggregate(
{$group:{_id:"$gender",count:{$sum:1}}},
{$sort:{count:-1}}
)
```
限制聚合管道返回的文档数
例如:查询2条学生信息
```
db.stu.aggregate({$limit:2})
```
跳过指定数量的文档,并返回余下的文档
例如:查询从第3条开始的学生信息
```
db.stu.aggregate({$skip:2})
```
例如:统计男生、女生人数、按人数升序,取第二条数据
说明:顺序是先写skip,再写limit
```
db.stu.aggregate(
{$group:{_id:"$gender",count:{$sum:1}}},
{$sort:{count:1}},
{$skip:1},
{$limit:1}
)
```
将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
语法:`db.集合名称.aggregate({$unwind:"$字段名称"})`
```
db.test.inset({_id:1,item:"t-shirt",size:["S","M","L"]})
db.test.aggregate({$unwind:"$size"})
```
属性preserveNullAndEmptyArrays值为false表示丢弃属性值为空的文档,为true表示保留属性值为空的文档
用法:
```
db.inventory.aggregate(
{$unwind:{
path:"$字段名称",
preserveNullAndEmptyArrays:<boolean> # 防止数据丢失
}}
)
```
例如:`db.stu.ensureIndex({name:1})`
测试:插入100000万条数据到数据库中(可以在mongo-cli中使用js语法)
`for(i=0;i<1000000;i++){db.stu.insert({name:"test"+i,age:i})}`
第一次查询时间:(executionTimeMillisEstimate的值)
```
db.stu.find({name:"test100000"})
db.stu.find({name:"test100000"}).explain("executionStats")
```
建立索引后查询时间:
```
db.stu.ensureIndex({name:1})
db.stu.find({name:"test100000"}).explain("executionStats")
```
`db.stu.ensureIndex({"name":1},{"unique":true})`
`db.stu.ensureIndex({name:1,age:1})`
`db.stu.getindexes()`
`db.stu.dropIndex("索引名称")`
`pip install pymongo`
class TestMongo(object): def __init__(self): # 实例化一个client,连接到本地mongo服务器 client = MongoClient(host="172.0.0.1",port=27017) # 使用方括号的方式选择数据库和集合 self.collection = client["test"]["stu"] def test_insert(self): #insert接受字典,返回objectId ret = self.collection.insert_one({"name":"test_python_mongo"}) print(ret) def test_insert_many(self): item_list = [{"_id":"{}",‘name‘:"test{}"}.format(i,i) for i in range(10)] # insert_many接受一个列表,列表中为所有需要插入的字典 t = self.collection.insert_many(item_list) # t.inserted_ids为所有插入的id for i in t.inserted_ids: print(i) if __name__=="__main__": obj = TestMonog() obj.test_insert() obj.item_insert_many()
原文:https://www.cnblogs.com/nuochengze/p/12845806.html