mongoDB

前期:

启动:sudo service  mongod start

停止:sudo service mongond stop

重启:sudo service mongod restart

查看是否启动成功:ps ajx|grep mongod

配置文件的位置: /etc/mongod.conf

默认端口:27017

日志的位置:/var/log/mongodb/mongod.log

基础命令:

查看当前的数据库:db
查看所有的数据库:show dbs / show  databases
切换数据库:use db_name
删除当前的数据库:db.dropDatabase()

数据类型:

Object ID: 文档ID
String: 字符串,必须是有效的UTF-8
Boolean: 存储一个布尔值,true或false
Integer: 整数可以是32位或64位,取决于服务器
Double: 存储浮点值
Arrays: 数组或列表, 多个值存储到一个键
Object: 用户嵌入式的文档,即一个值唯一个文档
Null: 存储Null值
TimesTamp: 时间戳
Data: 存储当期日期或时间的UNIX时间格式

注意点:

创建日期语句如下:参数的格式为YYYY-MM-DD。eg: new Data("2017-12-20")

每个文档都有一个属性,为_id, 保证每个文档的唯一性,也可以自己设置_id插入文档,如果没有提供,那么MongDB为每一个文档提供一个独特_id,类型为ObjectID。

objectID是一个12字节的十六进制数:
     前4个字节为当前时间戳
     接下来3个字节的机器ID
     接下来的2个字节中MongoDB的服务进程id
     最后3个字节是简单的增量值

mongodb中没有表的概念,集合相当于MySQL中的表。集合不用手动创建,向不存在的集合中第一次加入数据时,集合会被创建出来。

手动创建集合:

db.createCollention("sub",{capped:true, size:10})

“sub”为集合名。

参数capped: 默认值为false表示不设置上限,值为true表示设置上限。

参数size: 当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节。

查看集合:show collections

删除集合:db.集合名称.drop(), eg: db.sub.drop()

保存集合:db.集合名称.save()

mongodb插入数据:

db.collection.insert({})插入数据,_id 存在就报错。

db.collection.save({})插入数据,_id存在会更新。

eg:

db.test.insert({"name":"xiaoming","age":10}) # test中插入一条数据

mongodb更新操作:

db.test.update({name:"xiaoming"},{name:"xiaozhao"}) #把name为xiaoming的数据替换为{name:"xiaozhao"}
db.test.update({name:"xiaoming"},{$set:{name:"xiaozhao"}}) # 把name为xiaoming的数据替换为{name:"xiaozhao"}
db.test.update({name:"xiaoming"},{$set:{name:"xiaozhao"}},{multi:true}) #把name为xiaoming的数据全替换为{name:"xiaozhao"}
{multi:true}达到更新多条的目的

mongodb删除

db.test.remove({name:"xiaohong"},{justOne:true}) #默认会删除满足条件的所有数据,{justOne:true}能达到只删除一条的效果。

mongodb查询

find(): 查询
db.集合名称.find({条件文档})

findOne(): 查询,只返回第一个
db.集合名称.findOne({条件文档})

pretty(): 将结果格式化
db.集合名称.find({条件文档}).pretty()

自定义查询:使用$where后面写一个函数,返回满足条件的数据。

eg: 查询年龄大于30的学生

db.stu.find({
$where:function(){
    return this.age>30;}
})

注意:在查询结果中,可以只返回自己所需的字段 

db.集合名称.find({},{字段名称:1})

eg: db.stu.find({},{_id:0,name:1,gender:1}) # 显示name,gender字段

除_id字段,其他字段不显示 就不写,_id字段默认显示,_id:0:表示不显示。

比较运算符

等于:默认是等于判断,没有运算符

小于:$lt (less than)

小于等于: $lte (less than equal)

大于:$gt (greater than)

不等于: $ne

eg:

db.test.find(age:{$age:18}) # 查询年龄为18的数据

范围运算符:

$in 在某个范围内,$nin 不在某个范围内。

eg:

db.test.find({age:{$in:[18,28,38]}}) # 查询年龄为18,28,38的数据。

逻辑运算符:

and:在json中写多个条件即可。

db.test.find({age:{$gte:18},gender:true}) # 查询年龄大于或等于18,并且性别为true的数据

or:使用$or,值为数组,数组中每个元素为json

db.test.find({$or:[{age:{$gte:18},{gender:true}}],name:"xiaohong"}) # 查询年龄大于或等于18或性别为true,并且姓名为“xiaohong”的数据

支持正则表达式:使用//或$regex编写正则表达式

eg:查找姓名以“ming”结尾的数据
db.stu.find({name:{$regex:
"ming$"}})
db.stu.find({name:{$regex:/ming$/}})

函数:

limit():用于读取指定数量的文档

eg: 查询2条学生的信息
db.stu.find().limit(2)

skip(): 用于跳过指定数量的文档

eg: 跳过前两个学生信息
db.stu.find().skip(2)

# 同时使用limit()与skip()
db.stu.find().skip(5).limit(4) # 查询6-9这四个学生的数据

sort():  用于对集合进行排序

db.集合名称.find().sort({字段:1,...}) #参数1位升序,-1为降序。
eg: 根据性别降序,再根据年龄升序
db.stu.find().sort({gender:-1,age:1})

count(): 用于统计结果个数

db.集合名称.find({条件}).count()
eg: db.stu.find({gender:true}).count()

db.集合名称.count({条件})
eg: db.stu.count({gender:true})

distinct() 对数据进行去重

db.集合名称.distinct("去重字段", {条件})

eg: db.stu.distinct("hometown",{age:{$gt:18}}) #年龄大于18岁的学生都来在于哪个家乡

数据的备份与恢复:

备份:mongodump -h dbhost -d dbname -o dbdirectry

-h: 服务器地址,也可以指定端口号

-d: 需要备份的数据库名称

-o: 备份数据的存放位置

eg:
mongodump -h 192.55.63.88:27017 -d test -o ~/Desktop/testbak

 数据恢复:

 mongorestore -h dbhost -d dbname --dir dbdirectory

-h: 服务器地址

-d: 需要恢复的数据库实例

--dir: 备份数据所在的位置

eg: mongorestore -h 192.55.63.88:27017 -d test1 --dir ~/Desktop/testbak/test

聚合aggregate 

聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个有多个阶段 (stage)组成的管道,可以对每个阶段的管道进行

分组、过滤等功能,然后经过一系列的处理,输出相应的结果。

db.集合名称.aggregate({管道:{表达式}})

在mongodb中,文档处理完毕后,通过管道进行下一次处理。常用管道如下:

$group: 将集合中的文档分组,可用于统计结果

$match: 过滤数据,只输出符合条件的文档

$project: 修改文档的结构,如重命名、增加、删除字段、创建计算结果

$sort: 将输出文档排序后输出

$limit: 限制聚合管道返回的文档数

$skip: 跳过指定数量的文档,并返回余下的文档

$unwind: 将数组类型的字段进行拆分

注意:$group 对应的字典中有几个键,结果中就有几个键;分组依据需要放到'_id'后面;取不同的字段值需要使用$,'$age','$gender';取字典嵌套的字典中的值的时候‘$_id.country’

常用表达式: (语法:表达式:'$ 列名')

$sum:  计算总和,$sum:1表示以一倍计数

$ avg: 计算平均值

$min: 获取最小值

$max: 获取最大值

$push: 在结果文档中插入值到一个数组中

$first: 根据资源文档的排序获取第一个文档数据

$last: 根据资源文档的排序获取最后一个文档数据

eg1: 按gender进行分组,获取不同组的数量与平均年龄
db.stu.aggregate({$group:{_id:"$gender",cpunt:{$sum:1},avg_age:{$avg:"age"}}})

eg2: 按照hometown进行分组,获取不同组的平均年龄
db.stu.aggregate({$group:{_id:"hometown",mean_age:{$avg:"$age"}}})

group by null 将集合中所有文档分为一组。

eg: 求学生总人数、平均年龄
db.stu.aggregate({$group:{_id:null,counter:{$sum:1},avg_age:{$avg:'$age'}}})

$project: 修改输入文档的结构,如重命名、增加、删除字段、创建计算结果。

eg: 查询男生、女生人数,输出人数
db.stu.aggregate({$group:{_id:'$gender',counter:{$sum:1}}}{$project:{_id:0,counter:1}})

$match  用于过滤数据,只输出符合条件的文档 (match 是管道命令,能将结果交给后一个管道,但是find不可以)

eg: 查询年龄大于20的男生、女生人数
db.stu.aggregate({$match:{age:{$gt:20}}},{$group:{_id:'$gender',counter:{$sum:1}}})

 $sort 将输入文档排序后输出

eg: 查询男生、女生人数,按人数降序排列
db.stu.aggregate({$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}})

$limit限制聚合管道返回的文档数

eg:查询2条学生信息
db.stu.aggregate({$limit:2})

$skip 跳过指定数量的文档,并返回余下的文档

eg: 统计男生、女生人数,按人数升序,取出第二条数据
db.stu.aggregate({$grop:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:1}},{$skip:1},{$limit:1})

注意:先写skip,再写limit

$unwind 将一个文档中的某一个数组类型字段拆分为多条,每一条包含数组中的一个值

eg:
db.t2.insert({_id:1,item:'T-shirt',size:['S','M','L']})
db.t2.aggregate({$unwind:'$size'})

输出:
{"_id":1,"item":'T-shirt',"size":'S'}
{"_id":1,"item":'T-shirt',"size":'M'}
{"_id":1,"item":'T-shirt',"size":'L'}

db.集合名称.aggregate({$unwind:{patrh:"$字段名称",preserveNillAndEmptyArrays:<boolean>}})

preserveNillAndEmptyArrays为true时,保留属性值为空的文档。

索引:提升查询速度(默认情况下索引字段的值可以相同)

语法:db.集合名称.ensureIndex({属性:1}),1表示升序,-1表示降序

创建唯一索引(索引值唯一):

db.t1.ensureIndex({"name":1},{"unique":true})

创建联合索引:

db.t1.ensureIndex({name:1,age:1})

查看当前集合的所有索引:

db.t1.getIndexes()

删除索引:

db.t1.dropIndex({'索引名称':1})

原文地址:https://www.cnblogs.com/-hao-/p/14891390.html