Mongodb使用

模式自由:可以把不同结构的文档存储在同一个数据库里

面向集合的存储:适合存储json风格文件的形式

完整的索引支持:对任何属性可索引

复制和高可用性:支持服务器之间的数据复制,支持主从模式及服务器

常用的NoSQL常用的四大类:

redis:   键值型(键值数据库是形式最简单的NoSQL,数据中每一个值都有专门的键值对匹配,)

Mongodb: 文档型(文档数据库以类似文档的结构存储数据,可以采用无模式的形式,数据要求不严格,表结构可变)

HBase: 列存储(以列簇式存储,将同一列数据存在一起,在处理大数据集的时候,就可以具备更高的性能和扩展性)

Ne04J:图形(类似于图的结构存储数据,可以利用图结构相关算法,便于探索数据之间的联系)

NoSQL的缺点:

1:不支持SQL语句:不支持SQL支持,学习和使用成本高

2:提供的功能有限:无事务处理,完整的解决方案和报表等支持不好

3:稳定性:产品的完善程度和稳定性,不能和几十年历史的关系型数据库相提并论

SQL术语/概念 MongoDB术语/概念 描述
database database 数据库
table collection 数据库表/集合
column field 数据库属性/字段(域)
row document 数据记录行/文档
index index 索引
primary key primary key 主键,MongoDB默认自动将_id字段设置为主键,可以手动设置

Mongodb数据库基本命令:

查看当前数据库: db

查看所有数据库名称,列出所有在物理上存在的数据库: show dbs

切换数据库,如果数据库不存在也并不创建,直接插入数据或创建集合时数据库才创建:use 数据库名称

删除当前数据库,如果数据库不存在,则什么也不做: db.dropDatabase()

db.createCollection(name,options)   name是要创建的集合的名称,option是一个文档,选项参数是可选的,所以需要到指定的集合名称

不限制集合大小:db.createCollection("stu")

限制集合大小:

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

参数size单位是字节,当capped为true时,才设置

db.createCollection("stu",{capped:true,size:6142800})

查看当前数据库的集合: show collections

删除命令:db.stu.drop()

MongoDB中常用的几种数据类型:

ObjectID:文档ID

String:字符串,最常用,必须是有效的UTF-8

Boolean:存储一个布尔值,true或false

Integer:整数可以是32位或64位,这取决于服务器

Double:存储浮点值

Arrays:数组或列表,多个值存储到一个键

Null:存储Null值

Timestamp:时间戳,表示从1970-1-1到现在的秒数

Date:存储当前日期或时间的UNIX时间格式

创建日期语句如下:注意参数的格式YYYY-MM-DD

Date('2017-12-20')

ObjectID:

_id是一个12字节的十六进制数,保证每一份文件的唯一性:

前4个字节为当前时间戳,之后3个字节的机器ID,接下来的2个字节MongoDB的服务进程id

剩余3个字节是简单的增量值

接下来的2个字节的MongoDB的服务进程id

剩余3个字节是简单的增量值

一个字节等于2位十六进制(一位十六进制的数等于四位二进制的数,一个字节等于8位二进制数)

插入:如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectID

方法一:db.stu.insert({name:'gj',gender:1)

方法二:s1={_id:'20160101',name:'hr'}

    s1.gender=0

    db.stu.insert(s1)

简单查询:db.集合名称.find()

更新语法: db.集合名称.update(<query>,<update>,{multi:<boolean>})

query:查询条件,类似sql语句update中的where

update:更新操作符.类似sql语句update中的set部分

multi:可选,默认为false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新

全文档更新:db.stu.update({name:'hr'},{name:'nmc'})

指定属性更新,通过操作$set

db.stu.insert({name:'hr',gender:0})

db.stu.update({name:'hr'},{$set:{name:'hys'}})

修改多条匹配到的数据:

db.stu.update({},{$set:{gender:0}},{multi:true})

保存:   db.集合名.save(document)如果文档的_id已经存在则修改,如果文档的_id不存在则添加

db.stu.save({_id:'20160102','name':'yk',gender:1})

db.stu.save({_id:'20160102','name':'wyk'})

删除:  db集合名称.remove(

 <query>,

{

justOne:<boolean>

}

)

参数query:可选,删除的文档的条件

参数justOne:可选,如果设为true或1,只删除一条,默认false,表示删除多条

只删除匹配的第一条: db.stu.remove({gender:0},{justOne:true})

全部删除:db.stu.remove({})

创建示例数据:

创建集合stu,文档的属性包含:_id,name,hometown,age,gender

示例如下:

db.stu.drop()

db.stu.drop()
db.stu.insert({_id : 1, name:'郭靖',hometown:'蒙古',age:20,gender:tr
ue})
db.stu.insert({_id : 2, name:'⻩蓉',hometown:'桃花岛',age:18,gender:
false})
db.stu.insert({_id : 3, name:'华筝',hometown:'蒙古',age:18,gender:fa
lse})
db.stu.insert({_id : 4, name:'⻩药师',hometown:'桃花岛',age:40,gende
r:true})
db.stu.insert({_id : 5, name:'段誉',hometown:'⼤理',age:16,gender:tr
ue})
db.stu.insert({_id : 6, name:'段王爷',hometown:'⼤理',age:45,gender:
true})

数据查询

1.基本查询

find():查询全部符合条件数据   db.集合名称.find({条件文档})

db.stu.find({age:18})

方法findOne():查询,只返回第一个

db.集合名称.findOne({条件文档})

db.stu.findOne({age:18})

方法pretty():将结果格式化

db.集合名称.find({条件文档}).pretty()

db.stu.find({age:18}).pretty()

比较运算符

小于:$lt   小于或等于:$lte  大于:$gt   大于或等于:$gte 不等于 $ne

查询年龄大于或等于18的学生: db.stu.find({$gte:18}})

逻辑运算符

默认是逻辑与的关系

db.stu.find({age:{$gte:18},gender:true}

逻辑或:使用or

查询年龄大于18,或性别为0的学生

db.stu.find({$or:[{age:{$gt:18}},{gender:true}]})

and和or一起使用

查询大于18或性别为0的学生,并且学生的姓名为gj

db.stu.find({$or:[{age:{$gt:18}},{gender:true}],name:'gj'})

范围运算符

使用$in,$nin 判断是否在某一个范围内

查询年龄为18,28的学生

db.stu.find({$age:{$in:[18,28]}})

支持正则表达式

使用/ /或regex编写正则表达式

查姓黄的学生

db.stu.find({name:/^黄/})

db.stu.find({name:{$regex:'^黄'}})

自定义查询

使用$where后面写一个函数,返回一个满足条件的数据

查询年龄大于30的学生

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

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

db.集合名称.find().limit(数值)  未指定参数则显示集合中的所有文档

查询2条学生信息

db.stu.find().limit(2)

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

db.集合名称.find().skip(数值) 默认是0

查询从第3条学生开始查

db.stu.find().skip(2)

skip()和limit()可以一起使用,不分先后顺序

创建数据集:

for(i=0;i<15;i++){db.nums.insert({_id:i})}

查询第5至8条数据

db.nums.find().limit(4).skip(5)

投影:

在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段

如:一个文档有5个字段,需要显示3个,投影其中3个字段即可

语法:

参数为字段与值,值1为显示,值为0不显示

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

对于需要显示的字段,设置为1即可,不设置即为不显示

对于_id列默认是显示的,如果不需要显示明确设置为0

db.stu.find({},{name:1,gender:true})

db.stu.find({},{_id:0,name:1,gender:true})

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

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

参数为1为升序排列

参数为-1为降序排列

根据性别降序,,再根据年龄升序

db.stu.find().sort({gender:-1,age:1})

统计个数count()用于统计结果集中文档条数

db.集合名称.find({条件}).count()

也可以为:  db.stu.count({条件})

db.stu.find({gender:1}).count()

db.stu.count({age:{$gt:20}},gender:true})

消除重复

方法distinct()对数据进行去重

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

db.stu.distinct('hometown',{age:{$gt:18}})

聚合aggregate

聚合主要用于计算数据,类似sql中的sum(),avg()

语法:

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

原文地址:https://www.cnblogs.com/zhouzetian/p/9614950.html