MongoDB系列——中级篇

查找并修改(findAndModify)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
db.collection.findAndModify({
query: <document>,
# 查询条件
sort: <document>,
# 多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,该对象将被操作
remove: <boolean>,
# 若为true,被选中对象将在返回前被删除
update: <document>,
# 一个修改器对象
new: <boolean>,
# 若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略
fields: <document>,
# 返回对象显示的字段 { <field1>: 1, <field2>: 1, ... }
upsert: <boolean>
# true:查询为空创建新对象
});

# 实例
db.person.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}}
});

Read More

MongoDB系列——入门篇

安装(windows)

1.去MongoDB官网下载安装包,我们发现有32bit64bit32bit的mongodb最大只能存放2G的数据,64bit就没有限制。
2.安装好后,将mongodb的bin路径配置到环境变量PATH中

启动与关闭

1
2
3
$ mongod --dbpath=D:\mongodb\db  #dbpath为数据库文件存放的目录,默认模式,可以不需要用户名和密码
$ mongod --dbpath=D:\mongodb\db --auth # auth表示开启安全认证模式
$ db.shutdownServer() #关闭数据库 也可以使用kill -2 pid,不要使用kill -9 pid

你也可以通过访问 http://localhost:27017/ 来判断是否启动成功

基本操作(mongoDB 3.0.4)

数据库

1
2
3
4
5
6
7
8
9
$ use mydb #创建数据库,并且使用它,如果存在,使用这个数据库
$ show dbs #查询已有的数据库列表
$ show collections #显示当前数据库中的所有的集合,相当于关系数据库的表
$ db.dropDatabase() #删除当前数据库
$ db.cloneDatabase(“127.0.0.1”) #将指定机器上的数据库的数据克隆到当前数据库
$ db.copyDatabase("mydb", "temp", "127.0.0.1") #将本机的mydb的数据复制到temp数据库中
$ db.repairDatabase() #修复当前数据库
$ db.stats() # 获取数据库的状态
$ db.getMongo() # 查看当前db的链接机器地址

Read More

JavaScript系列——语句和函数

语句

if语句

1
2
3
4
5
6
7
8
var i = 30;
if (i > 10) {
alert("i 大于 25.");
} else if (i < 0) {
alert("i 小于 0.");
} else {
alert("i 在0 和 10 之间.");
}

do-while语句

1
2
3
4
5
6
var i = 0; 
do {
i += 3;
} while (i < 10);

alert(i) //i=12
do-while 这种后测试循环语句最常用于循环体中的代码至少要被执行一次的情形。

Read More

JavaScript系列——操作符

一元操作符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var s1 = "2"; 
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1++; // 值变成数值 3 --先转为数值类型
s2++; // 值变成 NaN
b++; // 值变成数值 1 --false先转为0,true先转为1
f--; // 值变成 0.10000000000000009(由于浮点舍入错误所致) --执行-1
o--; // 值变成数值-2 --调用valueOf方法 返回为数值就-1,其他按上面的规则


var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};

s1 = +s1; // 值变成数值 1
s2 = +s2; // 值变成数值 1.1
s3 = +s3; // 值变成 NaN
b = +b; // 值变成数值 0
f = +f; // 值未变,仍然是 1.1
o = +o; // 值变成数值-1

s1 = -s1; // 值变成了数值-1
s2 = -s2; // 值变成了数值-1.1
s3 = -s3; // 值变成了 NaN
b = -b; // 值变成了数值 0
f = -f; // 变成了-1.1
o = -o; // 值变成了数值 1

Read More

JavaScript系列——数据类型

语法

  • 区分大小写
    ECMAScript 中的一切(变量、函数名和操作符)都区分大小写
  • 标识符
    所谓标识符,就是指变量、函数、属性的名字,或者函数的参数:
    a.第一个字符必须是一个字母、下划线(_)或一个美元符号($)
    b.其他字符可以是字母、下划线、美元符号或数字
  • 严格模式
    ECMAScript 5 引入了严格模式(strict-mode),可以在脚本的顶部加入,也可以在函数的内部加入。
1
2
3
4
5
"use strict";

function doSomething(){
"use strict";
}

变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//全局变量
var message; //值为undefined
var maeesage = 'hello';
message = 100; //有效,但是不推荐,并且不管位置在哪,定义的都为全局变量,不利于维护

//局部变量
function test(){
var msg = "hi"; // 局部变量
}
test();
alert(msg); //错误!

//同时定义多个变量,用逗号隔开
var message = "hi",
found = false,
age = 29;

Read More

Shell特殊字符小结


shell通配符

字符 含义 实例
* 匹配 0 或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有,如ab,acb,a22b
? 匹配任意一个字符 a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b
[list] 匹配 list 中的任意单一字符 a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
[!list]或[^list] 匹配 list 中的任意单一字符 a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b
[x-y] 匹配 x-y 中的任意单一字符 如:[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b
{string1,string2,…} 匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一

注意:通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆,把通配符理解为shell 特殊代号字符就可.

Read More

JavaScript系列——作用域和作用域链

作用域

JavaScript通过函数管理作用域。在函数内部声明的变量只在这个函数内部,函数外面不可用。另一方面,全局变量就是在任何函数外面声明的或是未声明直接简单使用的。在实现项目中,为了避免全局变量冲突导致,我们应该尽量的减少全局变量的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function sum(x, y) {
// 不推荐写法: 隐式全局变量
result = x + y; //优化:var result = x + y; 使用var
return result;
}

// 反例,勿使用
function foo() {
//相当于:
//var a = 0 ;
//b = 0; 隐式全局变量
var a = b = 0;
// ...
}

Read More

CopyOnWriteArraySet实现原理

特点

  1. COW机制实现
  2. 无序的
  3. 线程安全
  4. 唯一性
  5. 读写分离

数据结构

CopyOnWriteArraySet继承于AbstractSet,由于它是线程安全的,我们一般认为它是HashSet的线程安全实现,但是它和HashSet有本质的区别,HashSet是通过散列表实现的,而CopyOnWriteArraySet是通过动态数组实现,内部元素由CopyOnWriteArrayList负责维护,CopyOnWriteArraySet的元素的唯一性,是通过CopyOnWriteArrayList的addIfAbsent和addAllAbsent实现的。它和CopyOnWriteArrayList一样,使用用于读大于写的场景中。

1
2
3
4
5
public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements java.io.Serializable {
//使用CopyOnWriteArrayList来保存元素
private final CopyOnWriteArrayList<E> al;
...
}

Read More

CopyOnWriteArrayList实现原理

特点

  1. COW机制实现
  2. 有序的
  3. 线程安全
  4. 读写分离

数据结构

COW就是Copy-On-Write,是程序设计的一种优化策略;当我们需要对一份共享的数据进行修改时,我们可以先将这份共享数据拷贝一份,待我们修改完成后再将这份拷贝放回原始引用处,所以COW实现机制的容器也被叫做即写时复制容器。这样做的好处就是在多线程的环境中,我们获取元素的时候仍然不需要加锁。CopyOnWriteArrayList底层和ArrayList一样,都是使用数组来保存所有元素的。

1
2
3
4
//锁,在新增修改是实现并发控制
transient final ReentrantLock lock = new ReentrantLock();
//数组,用来保存元素,volatile实现多线程时的可见性
private volatile transient Object[] array;

Read More

LinkedHashSet实现原理

特点

  1. Set接口实现,HashSet的子类
  2. 允许null值
  3. 元素不重复
  4. 迭代有序(插入顺序或访问顺序)
  5. 非线程安全

数据结构和初始化

LinkedHashSet的源码非常的简单,如下就是所有的源码,从代码中可以看出,都是构造函数,并且都是调用了父类HashSet的构造函数HashSet(int initialCapacity, float loadFactor, boolean dummy),还记得这个HashSet的构造方法吗?它会初始化一个LinkedHashMap用来保存元素,对的,LinkedHashMap底层就是使用LinkedHashMap来保存元素的,所有LinkedHashSet也是哈希表和双重链表的结合体,所有的元素保存到LinkedHashMap的key上,value为默认常量,所以是唯一的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class LinkedHashSet<E> extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {


private static final long serialVersionUID = -2851667679971038690L;
//指定初始容量和加载因子
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}

//指定初始容量,加载因子默认为0.75
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}

//默认构造函数
public LinkedHashSet() {
super(16, .75f, true);
}

//列表元素初始化
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true);
addAll(c);
}
}

相关

像更好的了解LinkedHashSet,先了解下LinkedHashMap和HashSet是非常必要的:LinkedhashMap实现原理HashSet实现原理