Mongodb学习日记
About 5 min
Mongodb学习日记
Mongodb概念解析
mongodb与mysql在一些概念上的对比
| mysql概念 | mongodb概念 | 解释 | 
|---|---|---|
| database | database | 数据库 | 
| table | collection | 表/集合 | 
| row | document | 记录行/文档 | 
| column | field | 列/字段 | 
| index | index | 索引 | 
| table joins | 表连接/不支持 | |
| primary key | primary key | 主键/自动将_id字段设置为主键 | 
一些简单的命令操作
#查看所有的数据库
>	shows dbs
#切换数据库
>	use test
#MongoDB连接命令
>	mongodb://admin:123456@host/test
##数据库相关
创建数据库/对象
>	db.runoob.insert({"name":"clsld"})
删除数据库
>	db.dropDatabase()
##集合相关
创建集合,name为要创建的集合名称,options为可选参数,可以指定有关内存大小及索引的选项
>	db.createCollection(name,options)
>	db.createCollection("test",{capped:true,autoIndex:true,size:6142800,max:10000})
在Mongodb中其实并不需要创建集合,当插入一些文档时,mongo就会自动创建
>	db.mycol2.insert("name":"test")
删除集合
>	db.collection.drop()
>	db.mycol2.drop()
##文档相关
插入文档
mongo使用insert()或者save()方法向集合中插入文档
>	db.COLLECTION_NAME.insert(document)
>	db.COLLECTION_NAME.save(document)
1、save:如果_id存在则更新数据,如果不存在就插入数据,可以用db.collection.insertOne()或db.collection.replaceOne()代替
2、insert:偌插入的主键已存在会抛异常
更新文档
>	db.collection.update(<query>,<update>,{
	upset:<boolean>,
	multi:<boolean>,
  writeConcern:<document>
})
query:update的查询语句,类似sql update 查询内where后面的参数
update:update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set的参数
upsert:可选,参数意思是如果不存在update记录,是否插入objNew,true为插入,默认是false,不插入
multi:可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
writeConcern:可选,抛出异常的级别
>	db.col.update(
  {'title':'MongoDB 教程'},
  {$set:{'title':'MongoDB'}})
	WriteResult(
    { 
    	"nMatched" : 1,
    	"nUpserted" : 0, 
    	"nModified" : 1 
    }
  )   # 输出信息
> db.col.find().pretty()#查看替换后的数据
>	db.col.update({"count":{$gt:1}},{$set:{"test":"OK"}}); #只更新第一条记录
> db.col.update({"count":{$gt:3}},{$set:{"test2":"OK"}},false,true); #全部更新
> db.col.update({"count":{$gt:4}},{$set:{"test":"OK"}},true,false); #只添加第一条
> db.col.update({"count":{$gt:5}},{$set:{"test5":"OK"}},true,true);	#全部添加进去
> db.col.update({"count":{$gt:15}},{$inc:{"count":1}},false,true);	#全部更新
> db.col.update({"count":{$gt:10}},{$inc:{"count":1}},false,false);	#只更新第一条记录
删除文档
> db.collection.remove(<query>,<justOne>)
>	db.collection.remove(<query>,{justOne:<boolean>,writeConcern:<document>})
query:删除文档的条件
justOne:如果设为true或1,则删除一个文档,如果不设置该参数,或使用默认值false,则删除所有匹配条件的文档
writeConcern:抛出异常的级别
> db.col.remove({"title":"MongoDB教程"})
查询文档
> db.collection.find(query,projection)
query:使用查询操作符指定查询条件
projectino:使用投影操作符指定返回的键,查询是返回文档中所有键值,只需省略改参数即可
> db.col.find().pretty()
如果你需要易读的方式读取数据,可以使用pretty方法,pretty()方法以格式化的方式来显示所有文档
>	db.col.find({key:value,key1:value1}).pretty()	#and
> db.col.find($or:[{key:value},{key1:value1}]).pretty()	#or
>	db.col.find({"likes":{$gt:50},$or:[{"by":"VAN"},{"title":"monfo"}]}).pretty() # and & or 联合使用
#创建索引
> db.collection,createIndex(keys,options)
语法中,key值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可
> db.col.createIndex({"title":1,"description":-1})
#聚合操作
> db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)MongoDB的数据结构
String 字符串
Integer 整数数值
Boolean 布尔值
Double 双精度浮点值
Min/Max keys 将一个值与BSON(二进制的Json)元素的最低值和最高值相对比
Array 用于将数组或者列表或者多个值存储为一个键
TImestamp 时间戳
Object 用于内嵌文档
Null 用于创建空值
Symbol 符号,该数据类型基本等同于字符串类型
Date 日期时间
Object ID 对象ID
Binary Data 二进制数据
Code 代码类型
Regular expression 正则表达式
MongoDB与sql的where语句比较
| 操作 | 格式 | 范例 | sql中类似的语句 | 
|---|---|---|---|
| 等于 | db.col.find({"by":"菜鸟教程"}).pretty() | where by = "菜鸟教程" | |
| 小于 | {key:{$lt:value}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 | 
| 小于或等于 | {key:{$lte:value}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 | 
| 大于 | {key:{$gt:value}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 | 
| 大于或等于 | {key:{$gte:value}} | db.col.find({"lieks":{$gte:50}}).pretty() | |
| 不等于 | {key:{$ne:value}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 | 
MongoDB聚合表达式
| 表达式 | 描述 | 实例 | 
|---|---|---|
| $sum | 计算总和 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) | 
| $avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) | 
| $min | 获取集合中所有文档对应值的最小值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) | 
| $max | 获取集合中所有文档对应值的最大值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) | 
| $push | 将值加入一个数组中,不会判断是否有重复的值 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) | 
| $addToSet | 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) | 
| $first | 根据资源文档的排序获取第一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) | 
| $last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]] | 
MongoDB复制原理
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。