//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. 自己写一个Promise

    参考Promise 的  官方规范  https://promisesaplus.com/ Promise 其实就是一个状态机 它只有两种状态变化 pending    =>   fulfill ...

  2. PAT 乙级 1044

    题目 题目地址:PAT 乙级 1044 思路 简单的进制转化问题,根据题意进行相应的进制转化即可,因为题目已经划定了数据的求解范围,甚至连进制转化中的循环都不需要,进行简单计算就可以得出结果: 但本题 ...

  3. STMS传输队列中的请求状态一直是Running不能结束

    通过STMS传输请求时,遇到了如下问题: STMS传输请求,不论等多久的时间,请求状态一直是running,不能结束.但检查传输的内容时,发现CHANGE REQUEST包含的内容已经传输到目标Cli ...

  4. 十一、Shell 输入/输出重定向

    Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令 ...

  5. 多种方式实现依赖注入及使用注解定义bean

    构造注入 如何给构造方法中的参数注入方法呢如下 首先bean代码如下 package cn.pojo; public class Greeting { /** * 说的话 */ private Str ...

  6. php扩展开发-快速上手

    系统环境CentOS release 6.5 (Final) PHP版本php-5.6.27 扩展开发需要有php环境及php的源代码,我的PHP安装目录/home/zhangxiaomin/stud ...

  7. python3:判断手机的亮屏状态

    在用python对手机做一些自动化操作时,常常会判断手机的亮屏状态,知晓手机的亮屏状态后才好做进一步的动作,如给屏幕解锁等.  用于了解手机的亮屏情况,有一个adb命令可用: adb shell du ...

  8. python字符串处理方法

    一.combine & duplicate 字符串结合和复制 字符和字符串可以用来相加来组合成一个字符串输出: 字符或字符串复制输出. 二.Extract &Slice 字符串提取和切 ...

  9. 精通SpringBoot--整合Redis实现缓存

    今天我们来讲讲怎么在spring boot 中整合redis 实现对数据库查询结果的缓存.首先第一步要做的就是在pom.xml文件添加spring-boot-starter-data-redis.要整 ...

  10. 多线程并发测试(apache ad)

    1.配置 ThreadPoolTaskExecutor bean   <?xml version="1.0" encoding="UTF-8"?> ...