MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
下面是Sql与mongodb的术语对比
SQL | Mongodb |
---|---|
表(Talbe) | 集合(Collection) |
行(Row) | 文档(Document) |
列(Col) | 字段(Field) |
主键(Primary Key) | 对象ID(ObjectId) |
索引(Index) | 索引(Index) |
嵌套表(Embeded Table) | 嵌入式文档(Embeded Document) |
数组(Array) | 数组(Array) |
mongodb将数据存储为一个文档,已键值对的形式存储。
例如
{name:"wang"}
{"name":"wang"}
通过这个我们知道,在向mongodb的同一个表中插入数据的时候,插入的数据字段类型可以不一样,即使是相同的字段数据类型也可以不一样。
1、mongodb的使用
进入mongodb,shell后,使用show databases,可以查看说有的数据库,也可使用show dbs,展示所有的数据库,
1.1、创建数据库
mongodb创建数据库与sql稍有不用,mongodb可通过use dbname来切换和创建数据库,例如:use dalao ,如果大佬数据库存在时,则切换到dalao数据库,若不存在则直接创建dalao数据库
删除数据库:db.dropdatabase()
查看数据库状态:db.stats()
查看版本:db.version()
查看当前数据库连接地址:db.getMongo()
1.2、集合的创建和使用
use dbname,切换到对应的数据库,show collections查看所有的集合。
mongodb可以手动创建集合,也可直接插入数据时自动创建集合。
例如:db.dalaocollection.insert{name:"dage"}若dalaocollection不存在则会创建dalaocollections集合。
创建集合:db.createCollection(name,options)
例如:db.createCollection("dalao")
db.createCollection("dalao", {capped: true, size: 10})
参数capped: 默认值为false表示不设置上限,值为true表示设置上限.
参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,单位为字节,当⽂档达到上限时, 会将之前的数据覆盖, 最早添加的数据移出, 其余上移, 最后添加在最后一条
删除集合:db.collectionname.drop()
1.3、用户操作
创建用户:db.createUser({user:"laowang", pwd:"123456", roles:[{role:"userAdmin", db:"stu"}]})
展示用户:show users
删除用户:db.removeUser("laowang")
2、mongodb的数据类型
- Object ID: ⽂档ID
- String: 字符串, 最常⽤, 必须是有效的UTF-8
- Boolean: 存储⼀个布尔值, true或false
- Integer: 整数可以是32位或64位, 这取决于服务器
- Double: 存储浮点值
- Arrays: 数组或列表, 多个值存储到⼀个键
- Object: ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档
- Null: 存储Null值
- Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数
- Date: 存储当前⽇期或时间的UNIX时间格式
创建⽇期语句如下 :参数的格式为YYYY-MM-DD每个⽂档都有⼀个属性, 为_id, 保证每个⽂档的唯⼀性
new Date('2017-12-20')
3、插入数据
命令:db.collection.insertOne(),db.collection.insertMang([ ])
- db.dalao.insertOne({name: "dawang", sex: "男"})
- db.dalao.insertMany{
- [ {name:"dawang1", sex:"男”},
- {name: "dawang2", sex: "男"} ]
- }
db.集合名称.insert(document)插⼊⽂档时, 如果不指定_id参数, MongoDB会为⽂档分配⼀个唯⼀的ObjectId类型的_id
- db.stu.insert({name:'gj',gender:1})
- db.stu.insert({_id:"20170101",name:'gj',gender:1})
4、数据查询
命令:db.collectionName.find()
4.1、查询特定的数值:db.collectName.find({key:value, key1:value1})
例如:db.dalao.find({name: "wpf1"},{sex:"1"})
4.2、查询范围值数据:db.collectionName.find({"字段1":{"条件1":"限制范围1"}}, {"字段2":{"条件2":"限制范围2"}})
例如:db.dalao.find({age:{"$gt": 10}},{heigh:{"$lt":190}})
和前面查询特定的数据的方法一样,只不过固定值变成了范围({"$gt":10}代表大于10)。
下面是范围操作符及其意义:
操作符 | 意义 |
---|---|
$gt | 大于(great than) |
$gte | 大于等于(great than equal) |
$lt | 小于(less than) |
$lte | 小于等于(less than equal) |
$ne | 不等于(not equal) |
4.3、限制查询返回信息:db.collectionName.find(用于过滤的条件,用于限制的条件)
例如:去除age字段
db.dalao.find({age:{"$gt":20}},{age:0} ) #得到的返回数据中没有age信息
只返回age字段
db.dalao.find({age:{"$gt":20}}, {age: 1}) #得到的返回数据只有age和id信息
_id比较特殊,无论怎样,都要默认返回,如果我们真的不需要,那么必须就要把"_id"设置为0。
4.3、修饰返回结果
得到返回数据的总数
db.collectionName.find().count()
限定返回结果的数量
db.collectionName.find().limit(限制返回的数量)
对结果进行排序
db.collectionName.find().sort({字段名:-1或1})
其中-1位逆序,1为正序
数据去重
db.collectionName.distin({去重的字段:去重的条件})
例如:db.dalao.distin({name:{$nt:{age:10}}})
这句话的意思是将年龄不等于十岁的name去重,返回的是一个数组,里面是去重后的表中name字段的非重复的数据。
复杂查询等我学会了再补充
5、数据update
语法: db.collectionName.update(<query> ,<update>,{multi: <boolean>})
- 参数query:查询条件
- 参数update:更新操作符
- 参数multi:可选, 默认是false,表示只更新找到的第⼀条记录, 值为true表示把满⾜条件的⽂档全部更新
- db.stu.update({name:'hr'},{name:'mnc'}) 更新一条,没有更新的字段会丢弃.
- db.stu.update({name:'hr'},{$set:{name:'hys'}}) 更新一条
- db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部