MongoDB系列——中级篇
MongoDB系列——中级篇
查找并修改(findAndModify)
1 | db.collection.findAndModify({ |
1 | db.collection.findAndModify({ |
1.去MongoDB官网下载安装包,我们发现有32bit和64bit,32bit的mongodb最大只能存放2G的数据,64bit就没有限制。
2.安装好后,将mongodb的bin路径配置到环境变量PATH中
1 | $ mongod --dbpath=D:\mongodb\db #dbpath为数据库文件存放的目录,默认模式,可以不需要用户名和密码 |
你也可以通过访问 http://localhost:27017/ 来判断是否启动成功
1 | $ use mydb #创建数据库,并且使用它,如果存在,使用这个数据库 |
1 | var i = 30; |
1 | var i = 0; |
像 do-while 这种后测试循环语句最常用于循环体中的代码至少要被执行一次的情形。
1 | var s1 = "2"; |
1 | "use strict"; |
1 | //全局变量 |
字符 | 含义 | 实例 |
---|---|---|
* | 匹配 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 特殊代号字符就可.
JavaScript通过函数管理作用域。在函数内部声明的变量只在这个函数内部,函数外面不可用。另一方面,全局变量就是在任何函数外面声明的或是未声明直接简单使用的。在实现项目中,为了避免全局变量冲突导致,我们应该尽量的减少全局变量的使用。1
2
3
4
5
6
7
8
9
10
11
12
13
14function sum(x, y) {
// 不推荐写法: 隐式全局变量
result = x + y; //优化:var result = x + y; 使用var
return result;
}
// 反例,勿使用
function foo() {
//相当于:
//var a = 0 ;
//b = 0; 隐式全局变量
var a = b = 0;
// ...
}
CopyOnWriteArraySet继承于AbstractSet,由于它是线程安全的,我们一般认为它是HashSet的线程安全实现,但是它和HashSet有本质的区别,HashSet是通过散列表实现的,而CopyOnWriteArraySet是通过动态数组实现,内部元素由CopyOnWriteArrayList负责维护,CopyOnWriteArraySet的元素的唯一性,是通过CopyOnWriteArrayList的addIfAbsent和addAllAbsent实现的。它和CopyOnWriteArrayList一样,使用用于读大于写的场景中。1
2
3
4
5public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements java.io.Serializable {
//使用CopyOnWriteArrayList来保存元素
private final CopyOnWriteArrayList<E> al;
...
}
COW就是Copy-On-Write,是程序设计的一种优化策略;当我们需要对一份共享的数据进行修改时,我们可以先将这份共享数据拷贝一份,待我们修改完成后再将这份拷贝放回原始引用处,所以COW实现机制的容器也被叫做即写时复制容器。这样做的好处就是在多线程的环境中,我们获取元素的时候仍然不需要加锁。CopyOnWriteArrayList底层和ArrayList一样,都是使用数组来保存所有元素的。1
2
3
4//锁,在新增修改是实现并发控制
transient final ReentrantLock lock = new ReentrantLock();
//数组,用来保存元素,volatile实现多线程时的可见性
private volatile transient Object[] array;
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
25public 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实现原理。