MongoDB学习
概述
MongoDB 是一个基于分布式文件存储的NoSQL数据库
特点
- 模式自由 :可以把不同结构的文档存储在同一个数据库里、
- 面向集合的存储:适合存储 JSON风格文件的形式
- 完整的索引支持:对任何属性可索引
- 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移
- 自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器
- 丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中的内嵌的对象及数组
- 快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划
- 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
参考
基本数据结构
MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成
MongoDB文档类似于JSON对象,字段值可以包含其他文档、数组、文档数组
与sql类比
sql | mongoDB |
---|---|
database | database |
table | collection |
row | document |
column | field |
index | index |
table joins | 不支持 |
primary key | primary key (_id字段) |
操作
数据库
- use database_name 转到该数据库
- db 显示当前正在使用的数据库
- show dbs 显示所有有数据的数据库
表
基础语句
- db.collection.insert(document) 插入数据
> db.user.insert( [
> {
... "name": "chenyurong",
... "age": 25,
... "addr": "ShenZhen"
... },
... {
... "name": "LiQiLiang",
... "age": 27,
... "addr": "GuangZhou"
... }
... ])
- db.collection.find() 显示数据
> db.user.find()
{ "_id" : ObjectId("59a2782f6eb4c099dbb718a1"), "name" : "chenyurong", "age" : 25, "addr" : "ShenZhen" }
- db.collection.find() . pretty() 使输出格式化
> db.user.find().pretty()
{
"_id" : ObjectId("59abb034dca9453471d67f13"),
"name" : "chenyurong",
"age" : 25,
"addr" : "ShenZhen"
}
- db.user.remove({ }) 清空当前数据库下user表的所有数据
> db.user.remove({ })
> WriteResult({ "nRemoved" : 2 }) 显示删除的行数
- db.collection.find(query, projection)
· query(可选): 使用查询操作符指定查询条件,该参数是一个JSON对象,key一般为查询的列名,value为查询匹配的值。
· projection(可选):使用投影操作符指定返回的键。如果省略该参数,那么查询时返回文档中所有键值。该参数是一个JOSN对象,key为需要显示的列名,value为1(显示)或0(不显示)。
> db.user.find({"addr":"ShenZhen","age":25},{"_id":0}).pretty()
> { "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" }
范围操作符
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {:} | db.col.find({“by”:“MongoDb入门教程”}).pretty() | where by = ‘MongoDb入门教程’ |
小于 | {:{$lt:}} | db.col.find({“likes”:{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {:{$lte:} | db.col.find({“likes”:{$lte:50}}).pretty() | where likes <= 50 |
大于 | {:{$gt:}} | db.col.find({“likes”:{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {:{$gte:}} | db.col.find({“likes”:{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {:{$ne:}} | db.col.find({“likes”:{$ne:50}}).pretty() | where likes != 50 |
查询用户表中所有年龄大于等于25岁的用户
> db.user.find({"age": {$gte:25}},{"_id":0}).pretty()
> { "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" }
{ "name" : "LiQiLiang", "age" : 27, "addr" : "GuangZhou" }
{ "name" : "XiaoPai", "age" : 30, "addr" : "BeiJing" }
{ "name" : "YuChangHui", "age" : 32, "addr" : "FuJian" }
{ "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }
条件与
> db.user.find({"addr": "ShenZhen","age": {$gte:25}},{"_id":0}).pretty()
> { "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" }
{ "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }
条件或$or
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
> db.user.find({$or:[{"addr":"ShenZhen"},{"age":{$gte:30}}]}).pretty()
> {
"_id" : ObjectId("59ac1c57dca9453471d67f15"),
"name" : "ChenYuRong",
"age" : 25,
"addr" : "ShenZhen"
}
{
"_id" : ObjectId("59ac1c57dca9453471d67f17"),
"name" : "XiaoPai",
"age" : 30,
"addr" : "BeiJing"
}
{
"_id" : ObjectId("59ac1c57dca9453471d67f18"),
"name" : "YuChangHui",
"age" : 32,
"addr" : "FuJian"
}
{
"_id" : ObjectId("59ac1c57dca9453471d67f19"),
"name" : "XiaoHei",
"age" : 28,
"addr" : "ShenZhen"
}
排序sort()
sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
db.collection.find().sort({KEY:1}) //key表示要排序的字段
> db.user.find({"age":{$lt:30}}).sort({age:1}).pretty()
> {
"_id" : ObjectId("59ac1c57dca9453471d67f1a"),
"name" : "AnQi",
"age" : 20,
"addr" : "JieYang"
}
{
"_id" : ObjectId("59ac1c57dca9453471d67f15"),
"name" : "ChenYuRong",
"age" : 25,
"addr" : "ShenZhen"
}
{
"_id" : ObjectId("59ac1c57dca9453471d67f16"),
"name" : "LiQiLiang",
"age" : 27,
"addr" : "GuangZhou"
}
{
"_id" : ObjectId("59ac1c57dca9453471d67f19"),
"name" : "XiaoHei",
"age" : 28,
"addr" : "ShenZhen"
}
聚合aggregate()
db.collection.aggregate(AGGREGATE_OPERATION)
其中AGGREGATE_OPERATION的格式为
[
{
$group: {
_id: {
addr: '$addr'
},
totalCount: {
$sum: 1
}
}
}
]
- $group是固定的,表示这里一个分组聚合操作。
- _id表示需要根据哪一些列进行聚合,其实一个JSON对象,其key/value对分别表示结果列的别名以及需要聚合的的数据库列。
- totaoCount表示聚合列的列名。
- $sum表示要进行的聚合操作,后面的1表示每次加1。
eg: 根据地区统计用户人数
> db.user.aggregate([{$group:{_id:{userAddr:'$addr'},totalCount:{$sum:1}}}])
> { "_id" : { "userAddr" : "FuJian" }, "totalCount" : 1 }
{ "_id" : { "userAddr" : "JieYang" }, "totalCount" : 1 }
{ "_id" : { "userAddr" : "BeiJing" }, "totalCount" : 1 }
{ "_id" : { "userAddr" : "GuangZhou" }, "totalCount" : 1 }
{ "_id" : { "userAddr" : "ShenZhen" }, "totalCount" : 2 }
更新数据update()
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- query:对哪些数据进行更新操作。 update:对这些数据做什么操作。
- upsert(可选):如果不存在update的记录,是否将其作为记录插入。true为插入,默认是false,不插入。
- multi(可选):是否更新多条记录。MongoDb
- 默认是false,只更新找到的第一条记录。如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern(可选):表示抛出异常的级别。
eg:更新user表名为chenyurong的记录,将其年龄更改为25岁
> db.user.update({'name':'chenyurong'},{$set:{'age':25}})
//$set表示进行赋值操作。
删除数据remove()
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- query(可选):删除的文档的条件。
- justOne(可选):如果设为 true 或 1,则只删除一个文档。
- writeConcern(可选):抛出异常的级别。
eg: 删除名为LiQiLiang的用户
> db.user.remove({"name":"LiQiLiang"})
WriteResult({ "nRemoved" : 1 })
去重查询distinct()
db.集合名称.distinct(‘去重字段’,{条件})
eg:查找年龄大于18的性别(去重)
db.stu.distinct('gender',{age:{$gt:18}})
表达式
用于处理输入文档并输出
表达式:’$列名’
常用表达式
$sum:计算总和,$sum:1同count表示计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据
$group: