//mongoDB第1-3章节添加,修改,修改器的笔记:

//备注:和MySQL查询一样,时刻想着优化查询数据的时间和性能

//db.help() //数据库帮助信息

//db.blog.help() //集合帮助信息

//db.c.find().help() //返回find()方法的子方法信息

//清空集合数据

//db.blog.remove()

//插入信息

//db.blog.insert({'title' : 'bbbbb', 'content' : 'bfbfbf', 'hits' : 1})

//$inc是修改器,只能用于整数,长整形,浮点型

//db.blog.update({'title' : 'aaaaa'}, {'$inc' : {'hits' : 1}})

//$set是修改器,用于$inc与字符串修改

//db.blog.update({'title' : 'aaaaa'}, {'$set' : {'content' : 'testcontent'}})

//简单的新增属性/每次都是覆盖比较麻烦

//aa = db.blog.findOne({'title' : 'aaaaa'})

//aa.arr = ['view', 'click']

//db.blog.update({'title' : 'aaaaa'}, aa)

//如果comments存在$push将会插入数据在数据的末尾,反正则创建comments $push只能操作

//db.blog.update({'title' : 'aaaaa'}, {'$push' : {'comments' : {'name' : '张三', 'content' : '我的闪啊', 'reply' : 0}}})

//$addToSet与$push类型一样,只是前者可以避免插入重复项

//db.blog.update({'title' : 'aaaaa'}, {'$addToSet' : {'comment' : {'name' : '张三', 'content' : '我的闪啊', 'reply' : 0}}})

//删除comment节点属性

//db.blog.update({'title' : 'aaaaa'}, {'$unset' : {'comments' : {}}})

//$pull删除一维数组选项为view的数据

//db.blog.update({'title' : 'aaaaa'}, {'$pull' : {'arr' : 'view'}})

//数组的定位修改器,通过两种方式一种是位置,一种是定位操作符('$')

//db.blog.update({'title' : 'aaaaa'}, {'$inc' : {'comments.0.reply' : 1}})

//此处只会修改第一个数组元素的值

//db.blog.update({'comments.name' : '张三'}, {'$set' : {'comments.$.content' : 'testtemtnsd'}})

//查询文档数

//db.blog.count({'title' : 'aaaaa'})
//db.blog.find({'title' : 'aaaaa'}).count()

//更新多个文档,默认只能更新符合条件的第一个文档,如果想更新多个文档需要设置update的第四个参数为true

//db.blog.update({'title' : 'aaaaa'}, {'$inc' : {'hits' : 1}}, false, true)

//n表示更新的文档数, updatedExisting=true表示对文档已经进行了更新

//db.runCommand({'getLastError' : 1})

//移除comments的最后一个元素 {'$pop' : {key : 1}}末尾移除 / {'$pop' : {key : -1}}首位移除

//db.blog.update({"_id" : ObjectId("53fdb010fb4b2154fd546233")},{'$pop':{'comments':1}})

//db.blog.find()

//mongoDB第四章查询笔记:

//简单查询

//db.blog.find() //查询集合所有文档数据默认应该是20个, find()相当于是find({})

//db.blog.findOne() //查询集合一条文档数据,findOne()相当于是findOne({})

//并列条件查询 "And"

//db.blog.find({'title' : 'aaaaa', 'hits' : 10})

//指定列数的查询 "select" 备注:_id 指定也会被返回

//db.blog.find({'title' : 'aaaaa'}, {'title' : 1, 'hits': 1})

//排除指定的字段不显示的方法或不显示_id的方法

//db.blog.find({'title' : 'aaaaa'}, {'comments' : 0, '_id' : 0})

//查询条件的 '<','<=','>','>=','<>' 分别对应'$lt','$lte','$gt','$gte','$ne', '$ne'适应于所有类型

//db.blog.find({'hits' : {'$lt' : 50, '$gt' : 1}})

//db.blog.find({'hits' : {'$lte' : 50, '$gte' : 1}})

//db.blog.find({'title' : {'$ne' : 'dfdfdf'}})

//$or $in 查询 备注:第一个条件尽可能的能查询更多的信息这样才能提高效率

//db.blog.find({'$or' : [{'title' : 'aaaaa'}, {'hits' : 1}]})

//db.blog.find({'title' : {'$in' : ['aaaaa', 'vvvvv']}})

//db.blog.find({'$or' : [{'title' : {'$in' : ['aaaaa', 'bbbbb'] } }, {'hits' : 1} ]})

//取摸运算符号$mod 备注:$mod会将查询的第一个值除于$mod第一个给定的值,若余数等于第二个$mod给定的值则返回结果

//db.blog.find({'hits' : {'$mod' : [2, 1]}}) //备注将会返回hits为1 3 5 7 9 .....

//$not 用来查询指定条件不符合的文档通常会和正则一起使用

//db.blog.find({'hits' : {'$not' : {'$mod' : [2, 1]}}}) //备注将会返回hits为2 4 6 8 10 .....

//查询键值为null, null会匹配键值为null和键值不存在的文档数据

//db.blog.find({'nokey' : null})

//想查询键值为null的文档但是要排除键值不存在的文档方法使用$exists与$in

//db.blog.find({'test' : {'$in' : [null], '$exists' : true }})

//数组的查询

//db.blog.insert({'fruit' : ['apple', 'banana']})

//db.blog.insert({'fruit' : ['apple', 'putao']})

//db.blog.insert({'fruit' : ['chengzi', 'banana']})

//db.blog.find({'fruit' : 'apple', 'fruit' : 'banana'}) //备注这种写法是不合理的

//上面的数组查询是有问题的,不准确,需要使用$all

//db.blog.find({'fruit' : 'apple'})

//db.blog.find({'fruit' : 'banana'})

//查询文档数组中含有'apple'和'banana'的数据 结果得到一条记录

//db.blog.find({'fruit' : {'$all' : ['apple', 'banana']} })

//如果只想查询数组第二个元素是'banana'的结果 使用数组下标

//db.blog.find({'fruit.1' : 'banana'})

//可以使用$push和$addToSet来家数组

//db.blog.update({"_id" : ObjectId("53fec26ab5e462a952616f0a")}, {'$addToSet' : {'fruit' : 'liulian'}})

//想返回文档数组的前3条信息 $slice find函数的第二个参数是查询的列(select)

//db.blog.find({'title' : 'aaaaa'}, {'comments' : {'$slice' : 3} })

//想返回文档数组的第二条到第4条信息 $slice

//db.blog.find({'title' : 'aaaaa'}, {'comments' : {'$slice' : [1, 3]} })

//获取文档数组最后一条信息

//db.blog.find({'title' : 'aaaaa'}, {'comments' : {'$slice' : -1} })

//查询内嵌文档 查询与键值的顺序相关所以下面两种方式应该采用第一种方式 第二种方式需要写全子集键

//内嵌文档匹配要求整个文档完全匹配

//db.blog.find({'title' : 'aaaaa', 'comments.name' : '111' })

//db.blog.find({'comments' : {'name' : '111'} })

//$where查询 其他查询方式都无法实现的时候需要用到$where查询

//不到万不得以不应该使用$where 他比其他查询性能要慢点多

//db.blog.insert({'x' : 5, 'y' : 5})

//db.blog.insert({'x' : 3, 'y' : 7})

//db.blog.insert({'x' : 4, 'y' : 6})

//db.blog.insert({'x' : 1, 'y' : 8})

//db.blog.find({'$where' : 'this.x + this.y == 10'})

//db.blog.find({'$where' : 'function(){ return this.x + this.y == 10;}'})

//游标

/*

db.c.remove()

for(i=1; i<100; i++) {

db.c.insert({'x' : i})

}*/

//db.c.count()

//游标循环查询的文档数据

/*

var data = db.c.find()

while(data.hasNext()) {

obj = data.next()

print(obj.x)

}*/

//或者可以使用forEach

//var data = db.c.find()

//data.forEach(function(d){print(d.x)})

//返回一定数量的结果与排序 sort skip limit

//备注:三个顺序可以随意搭配但是一般还是按照上面的顺序

//{x : 1} x键值升序, {x : -1}x键值降序 如果指定多个键就按照键逐个进行排序

//db.c.find().sort({'x' : 1}).skip(10).limit(10) //通过x键值升序排列后从第10个开始取10条记录

//db.c.find().sort({'x' : 1}).limit(10) //默认从第一条开始取10条数据

//db.c.find().sort({'x' : 1}).skip(10) //从第10条开始取全部数据

//比较顺序

//有时候一个键值有可能有多个类型,mongoDB处理不同类型的数据是有个顺序:

//最小值

//null

//数字(整型,长整型,双精度型)

//字符串

//对象/文档

//数组

//二进制数据

//对象ID

//布尔型

//日期型

//时间戳

//正则表达式

//最大值

//备注:避免使用skip略过大量结果 这点很坑爹啊

//随机选取文档

//从集合随机挑选一个文档是常见的问题,最笨的方法就是选查询集合的总行数,然后在0到总行数之间取随机数

//此时db.blog.find().skip(xxxx).limit(1) skip有可能就会略过很大的结果 影响查询性能

//备注:本人建议文档插入时添加个字段size整型,相当于关系型数据库的自增id, 可以取出第100个记录的最后id,

//然后再通过id进行比较

//可以使用Math.random()类随机查询

//var total = db.c.find().count()

//var random = Math.floor(Math.random()*total)

//db.c.find().sort({'x' : 1}).skip(random).limit(1)

//mongoDB第五章索引笔记:

//索引就是用来加速查询的

//创建索引要使用ensureIndex()方法, 同一个集合同一个索引只需要创建一次, 多次创建是徒劳的

//索引是有方向的, 单个索引不需要考虑方向 但是多个索引需要考虑方向

//db.c.ensureIndex({'x' : 1}) //创建升序索引 {x : 1} , {x : -1}

//索引的方向 比如 {'user_name' : 1, 'age' : -1} 此结果将会先按照‘user_name’升序排列, 相同的用户名在按照‘age’降序排列

//创建索引测试集合 s

/*for(i=1; i < 100000; i++) {

db.s.insert({'number' : i, 'random' : Math.floor(Math.random()*i)})

}*/

//db.s.ensureIndex({'random' : 1})

//db.s.find({'number' : {'$gte' : 50}}).sort({'random' : 1}).limit(10)

//创建索引需要考虑的问题

//1、会做什么样的查询,其中哪些键需要索引

//2、每个键的索引方向是什么样的

//3、如何应对拓展

//内嵌文档创建索引和文档创建索引一样的

//db.blog.ensureIndex({'comments.name' : 1})

//为排序创建索引

//唯一索引/复合索引

//索引名称 默认: keyname1_dir1 即(random_1) keynameX代表键, dirX代表升序或降序

//自定义索引的名称

//db.c.ensureIndex({'x' : 1}, {'name' : 'x_index'})

//db.c.find({'x' : {'$lt' : 20}}).explain()

//使用explain检测查询的时间/影响的行数/是否使用索引

//使用hint强制使用索引,多数情况下是没有什么必要的

//cursor (BasicCursor没有使用索引 / BtreeCursor x_1 使用索引)

//millis 执行预测的时间(秒) 当然越接近0越好

//nscanned 执行查询的文档数

//n 执行返回的文档数

//索引管理

//数据库索引都保存在system.indexes集合中

//db.system.indexes.find()

//索引的修改

//db.c.ensureIndex({'x' : -1}, {'name' : 'c_x_index', 'background' : true})

//使用{'background' : true}可以使这个过程在后台执行, 如果没有添加那么在建立索引的期间将阻止所有请求

//索引的删除

//删除数据库liyang集合s的索引

//db.s.getIndexes()

//db.s.dropIndex('random_1')

//mongoDB第六章聚合笔记:

//MongoDB提供很强大的聚合工具,简单的统计文档的个数,复杂的可以利用Mapreduce做复杂的数据分析

//count()

//db.s.count()

//db.s.find({'random' : {'$lte' : 500, '$gte' : 490}}).count()

//distinct 用来查询出给定键的所有不同的值,和关系型数据库查询一样,必须指定集合和键

/*

db.people.remove()

for(i=1; i < 80; i++) {

db.people.insert({'age' : i, 'name' : 'x'+i})

}

//单个建之获取不同的值

db.runCommand({'distinct' : 'people', 'key' : 'age'})

*/

//group

//db.g.insert({'user_id' : 1, 'coin' : 5})
//db.g.insert({'user_id' : 1, 'coin' : 15})
//db.g.insert({'user_id' : 2, 'coin' : 15})
//db.g.insert({'user_id' : 2, 'coin' : 5})
/*
db.runCommand({
'group' : {
'ns' : 'g',
'key' : 'user_id',
'initial' : {'total':0},
'$reduce' : function(doc, prev) {
prev.total = prev.total + doc.coin
}
}
})
*/

/*
db.runCommand(
{
aggregate: "g",
pipeline: [
{ $group: { _id: "$user_id", total: { $sum: "$coin" } } },
{ $sort: { total: -1 } }
],
explain: false
}
)
*/

//ns 进行分组的集合

//key 文档分组依据的键,所有相同的键值将会划分到一组

//initial 每一组reduce函数调用的初始值

//$reduce : function(doc, prev) {} 每个文档都对应一次这个调用, 系统会传递两个参数,当前文档和累加器文档

//condition user_id小于3个文档

//Mapreduce是聚合中的明星,count distinct group 都可以实现
//使用Mapreduce的代价就是速度 group不是很快,MapReduce更慢,一般很少用到

//mongoDB第七章进阶指南笔记:

//通过数据库命令使用高级特性
//使用特殊的集合---固定大小的集合
//使用GridFS存储文件
//利用MongoDB对javascript的支持
//理解何为数据库应用,何时该使用

//数据库命令的工作原理
//db.g.drop() //返回TRUE 或 FALSE 实际上是
//db.runcommand({'drop' : 'g'})
//db.runCommand({'buildInfo' : 1}) //返回mongoDB的版本号和操作系统
//db.runCommand({'collStats' : 'c'}) //返回指定集合的统计信息
//db.runCommand({'drop' : 'test'}) //删除集合信息 errmsg
//db.runCommand({'isMaster' : 1}) //查询服务器是主服务器还是从服务器
//db.runCommand({'ping' : 1}) //检测服务器连接是否正常

//固定集合
//固定集合就是大小固定, 就像个环形的集合,插入新数据导致空间不足的时候会删除更早的信息
//创建固定集合的方法和普通的方法不一样 可以指定集合的文档的数量上限和集合的总容量
//db.createCollection('gd', {'capped' : true, 'size' : 10, 'max' : 100000})
//创建集合100000个字节, 文档上限10个
//db.runCommand({'collStats' : 'gd'})
//capped = true 表示集合大小固定

//服务器端脚本
//使用db.eval() 可以执行任意javascript的脚本
//db.eval('return 10+5')
//db.eval('function(){ return 1+4}')

//备注:只有传递参数的时候才必须使用封装的函数, 参数通过db.eval的第二个参数传递
//db.eval("function(u) {return u;}", ['apple']) //apple
//db.eval("function(data) {return 'hello, '+data+'';}", ['dfdf'])

//安全性
//执行javascript代码,就必须考虑mongoDB的安全性,使用不慎就会发生类似关系型数据库的注入是攻击
//例如想打印用户的用户名就要把用户名存放在username的字段的变量中,
//var fun = "function(username){ return 'hello '+username+''}"
//db.eval(fun, ['username'])
//如果传递参数 ';db.dropDatabase(); 这样整个数据库就被清理干净了
//所以我们需要使用占位符来替换

mongoDB权威指南学习笔记的更多相关文章

  1. HTTP权威指南-学习笔记

    目录 HTTP权威指南-学习笔记 HTTP: Web的基础 URL与资源 HTTP报文 连接管理 HTTP结构 Web服务器 代理 缓存 集成点: 网关,隧道及中继 Web机器人 识别,认证与安全 客 ...

  2. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...

  3. CSS权威指南学习笔记系列(1)CSS和文档

    题外话:HTML是一种结构化语言,而CSS是它的补充:这是一种样式语言.CSS是前端三板斧之一,因此学习CSS很重要.而我还是菜鸟,所以需要加强学习CSS.这个是我学习CSS权威指南的笔记,如有不对, ...

  4. Hadoop权威指南学习笔记二

    MapReduce简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.n ...

  5. Hadoop权威指南学习笔记一

    Hadoop简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出.一起学习一起进步. 转载请注明:http://blog.csdn.net/ ...

  6. Hadoop权威指南学习笔记三

    HDFS简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考.有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my ...

  7. IDA Pro权威指南学习笔记(一)

    一直不懂逆向,最近刚好不忙,于是学习逆向,用来做笔记,顺便和大家分享交流. 参考书籍<IAD PRO权威指南> 工具: PETools: ETools 是另一款很好的PE文件编辑工具,以前 ...

  8. css权威指南学习笔记 —— css选择器

    1,选择器:选择器的一些基本常用规则基本都记得,w3c上都有,平时也常用,不常用的一些后代选择器经常就忘记了.一些归纳一下后代选择器,加深一下印象: a:子选择器:   p>a  a是直接是p的 ...

  9. maven权威指南学习笔记(五)—— POM

    1. 简介 Archetype插件通过 pom.xml 文件创建了一个项目.这就是项目对象模型 (POM),一个项目的声明性描述. 当Maven运行一个目标的时候,每个目标都会访问定 义在项目POM里 ...

随机推荐

  1. Spring Boot 前世今生

    Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,就单从我个人的博客的访问量大幅增加就可以感受到大家对学习 Spring Boot 的热情,那么在这么多人热衷于学习 ...

  2. EasyUI获取正在编辑状态行的索引

    function getRowIndex(target){ var tr = $(target).closest("tr.datagrid-row"); return paseIn ...

  3. Q&A - ABTesting是啥?

    举个简单的例子,当你有一个日IP过千的网站,而你的网站首页几百年没有更改了,这个时候你想启用新的网页,而你有害怕新的页面用户不一定就非常喜欢,那么这个时候你就需要进行A/B测试了.测试的方法是将老页面 ...

  4. 通过rsync+inotify实现数据实时备份

    rsync的优点与不足 与传统的cp,scp,tar,备份方式相比,rsync具有安全性高备份迅速支持增量备份的优点,可以满足对实时性要求不高的需求,例如定期备份文件服务器数据到远端服务器,但是,当数 ...

  5. centos7.4安装rabbitmq服务(3.7.10版本)

    一.需要安装erlang版本依赖,可以使用二进制安装方式,也可以通过rpm安装,但是安装的时候会提示需要erlang版本>=19.3,而且直接默认yum仓库中的版本较低.,为了节省时间,文章中直 ...

  6. 第39-43课 thinkphp5完成商品会员价格功能(后置勾子afterInsert)

    目录 功能一:利用后置勾子,处理好商品主键id,会员的价格,再插入member_price表里. 要实现的功能: 思路: html里 控制器里 模型里的后置勾子afterInsert() 功能二:利用 ...

  7. django之模型层

    1. ORM MVC或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...

  8. Mysql存储过程中的事务回滚

    create procedure test(in a int) BEGIN ; ;-- 异常时设置为1 START TRANSACTION; ,); ,); THEN ROLLBACK; ELSE C ...

  9. loj2053 「HNOI2016」大数

    ref #include <algorithm> #include <iostream> #include <cstring> #include <cstdi ...

  10. html调用commonjs规范的js

    a.js define(function(require, exports, module) { var test = function(){ console.log("hello worl ...